Elasticsearch概念 使用docker安装Elasticsearch和kibana

目录

一、Elasticsearch概念

倒排索引和正向索引

正向和倒排

二、ES安装

三、安装 kibana

四、IK分词器

下载ES中文分词器

扩展或停用词条


一、Elasticsearch概念

倒排索引和正向索引

正向索引

        就像在mysql数据中搜索非主键字段的内容,就需要逐条数据的去查,比如加where条件,逐行扫描,也就是全表扫描,随着数据量增加,其查询效率也会越来越低。当数据量达到数百万时,就是一场灾难。

倒排索引

  • 文档(Document):用来搜索的数据,其中的每一条数据就是一个文档。例如一个网页、一个商品信息

  • 词条(Term):对文档数据或用户搜索数据,利用某种算法分词,得到的具备含义的词语就是词条。例如:我是中国人,就可以分为:我、是、中国人、中国、国人这样的几个词条

 比如以下图片中,小米词条在表数据id为1、3、4中有,文档id就就为1、3、4

 倒排索引的搜索流程如下(以搜索"小米手环"为例):

1)用户输入条件"小米手环""进行搜索。

2)对用户输入内容分词,得到词条:小米、手环。

3)拿着词条在倒排索引中查找,可以得到包含词条的文档id:1、3、4。

4)拿着文档id到正向索引中查找具体文档。

正向和倒排

那么为什么一个叫做正向索引,一个叫做倒排索引呢?

  • 正向索引是最传统的,根据id索引的方式。但根据词条查询时,必须先逐条获取每个文档,然后判断文档中是否包含所需要的词条,是根据文档找词条的过程

  • 倒排索引则相反,是先找到用户要搜索的词条,根据词条得到保护词条的文档的id,然后根据id获取文档。是根据词条找文档的过程

是不是恰好反过来了?

那么两者方式的优缺点是什么呢?

正向索引

  • 优点:

    • 可以给多个字段创建索引

    • 根据索引字段搜索、排序速度非常快

  • 缺点:

    • 根据非索引字段,或者索引字段中的部分词条查找时,只能全表扫描。

倒排索引

  • 优点:

    • 根据词条搜索、模糊搜索时,速度非常快

  • 缺点:

    • 只能给词条创建索引,而不是字段

    • 无法根据字段做排序

ES是面向文档存储的,可以是数据库中的一条商品数据,一个顶单信息

文档信息会被序列化为JSON格式后存储在ES中

索引(index):相同类型的文档集合

映射(mapping):索引中文档的字段约束信息,类似表的结构约束

比如:

我们统一的把Mysql与ES的概念做一下对比:

MySQLElasticsearch说明
TableIndex索引(index),就是文档的集合,类似数据库的表(table)
RowDocument文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式
ColumnField字段(Field),就是JSON文档中的字段,类似数据库中的列(Column)
SchemaMappingMapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema)
SQLDSLDSL是elasticsearch提供的JSON风格的请求语句,用来操作elasticsearch,实现CRUD

Mysql:擅长事务类型操作,可以确保数据的安全和一致性

Elasticsearch:擅长海量数据的搜索、分析、计算

Mysql和ES是互补关系,在合适的场景下选择合适的技术

二、ES安装

创建docker网络,在同一网络中的容器可以互联,相互访问

docker network create es-network

 查看已存在的网络

sudo docker network ls

注意】ES docker 镜像的版本为7.17.16 后续安装IK分词器的版本也要与之对应,否则启动报错,kibana版本也最好与之对应

拉取镜像:

sudo docker pull elasticsearch:7.17.16

使用 -m 标志为容器设置内存限制。这样就无需手动设置 JVM 大小了

  • -e "discovery.type=single-node":非集群模式

  • -e "http.host=0.0.0.0":监听的地址,可以外网访问

  • -v es-data:/usr/share/elasticsearch/data:挂载逻辑卷,绑定es的数据目录

  • -v es-logs:/usr/share/elasticsearch/logs:挂载逻辑卷,绑定es的日志目录

  • -v es-plugins:/usr/share/elasticsearch/plugins:挂载逻辑卷,绑定es的插件目录

  • 9200:供用户访问端口

  • 9300:个es结点互访的端口,现在非必须 

sudo docker run -d \--net es-network \-m 1GB \--name es \-e "discovery.type=single-node" \-v ./es/data:/usr/share/elasticsearch/data \-v ./es/plugins:/usr/share/elasticsearch/plugins \-v ./es/logs:/usr/share/elasticsearch/logs \--privileged \-p 9200:9200 \-p 9300:9300 \
elasticsearch:7.17.16

注意要在es/data所在目录下运行,或者改为绝对路径

ES启动有些许慢,可通过ES容器日志查看进度

 sudo docker logs --tail 100 -f es

ElasticSearch文件目录说明

目录说明
bin可执行文件目录
config配置文件目录
jdkJAVA工具包
lib第三方依赖库
logs输出日志目录
modules依赖模块目录
plugins插件目录
data数据存储目录

在浏览器中输入IP+端口访问:http://172.30.171.205:9200 即可看到elasticsearch的响应结果:

三、安装 kibana

kibana可以给我们提供一个elasticsearch的可视化界面,便于学习

拉取镜像:

sudo docker pull kibana:7.17.18

启动kibana容器

与ES需要在同一个网络es-network

添加环境变量ELASTICSEARCH_HOSTS指定ES访问地址,因为在同一个网络下,可以使用主机名es代替IP地址

sudo docker run -d \
--name kibana \
-e ELASTICSEARCH_HOSTS=http://es:9200 \
--net=es-network \
-p 5601:5601  \
kibana:7.17.18

 浏览器访问 kibana, http://172.30.171.205:5601

Add integrations:从如何来源添加数据 ; Explore on my own :自己探索,这里我们自己探索

使用Dev Tools对Elasticsearch发送DSL请求,点击旁边三杆,向下翻找到Dev Tools

输入DSL语句查询所有数据,点击三角发送请求

四、IK分词器

        使用默认的ES的分词器对中文的分词效果不好,可以发现ES英文分词效果可以,但是对中文只能一个字一个字的分,在搜索时效率低,并且搜不到自己想要的。所以要下载IK分词器,添加插件

 分词器的作用是什么?

  • 创建倒排索引时对文档分词

  • 用户搜索时,对输入的内容分词

查看ES插件数据卷目录挂在地址,也可以使用自己自己启动容器指定的目录,我的是:-v ./es/plugins:/usr/share/elasticsearch/plugins:

sudo docker volume inspect es-plugins

下载ES中文分词器

前往github上下载:https://github.com/medcl/elasticsearch-analysis-ik/releases,选择版本为7.17.16,复制链接地址

进入挂载目录下(es/plugins),服务器中使用wget命令下载

wget https://github.com/infinilabs/analysis-ik/releases/download/v7.17.16/elasticsearch-analysis-ik-7.17.16.zip

 创建ik目录,并将下载的压缩包解压到当前目录下

mkdir ikunzip elasticsearch-analysis-ik-7.17.16.zip -d ./ik

 或者将压缩包解压后拖入挂载目录下,并重命名为ik

mv elasticsearch-analysis-ik-7.17.16/ ik

 重启ES容器:

sudo docker restart es

IK分词器的分词模式

  • ik_smart:智能切分,粗粒度

  • ik_max_word:最细切分,细粒度

扩展或停用词条

在plugins/ik/config目录下找到 IKAnalyzer.cfg.xml 文件设置添加词条或停用词条的文件地址,这里是当前的config目录下

拓展词条

添加扩展词条,一些网络流词等词库中没有,新建ext.dic文件添加内容,这样就可以对这些没有的不能分词的词进行分词了

停用词条

目录下的stopword.dir文件中添加停用词

比如语气词,敏感词等

  • 利用config目录的IkAnalyzer.cfg.xml文件添加拓展词典和停用词典

  • 在词典中添加拓展词条或者停用词条

修改后需要重启ES容器,就可以根据自己添加或停用的词进行分词了。

我遇到的问题:

        7.17.20版本的ES没有对应的IK分词器版本,启动ES容器会报错

        7.17.18版本的ES容器,非root用户启动,有莫名的权限问题,贴在评论区了

        所以我改成了7.17.16版本的ES,启动正常,但是如果你是非root用户启动,也不是自己创建的数据卷挂载目录,需要修改es挂载目录 ./es 权限:
 

sudo chown -R teacher:teacher ./es/

END

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/4415.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

WEB攻防-.NET特性常见漏洞

目录 前置知识: DLL文件 .NET和DLL文件 C#和DLL文件 关系总结 .NET 配置调试-信息泄露 .NET 源码反编译-DLL 反编译与未授权访问 编译DLL文件 反编译DLL文件 注意事项 案例: 验证代码文件有没有可以绕过(Cookie&Session&…

【C++】二叉树的进阶

二叉树的进阶 二叉搜索树概念操作实现创建树形结构拷贝构造函数构造函数析构函数赋值运算符重载循环版本查找插入删除 递归版本查找插入删除 应用K模型KV模型性能分析 二叉树进阶面试题二叉树创建字符串二叉树的分层遍历I最近公共祖先二叉搜索树与双向链表前序遍历与中序遍历构…

toFixed() 保留小数不精准,大数据计算 bignumber.js、big.js

Big.js: Big.js 是另一个类似于 Decimal.js 的高精度计算库,它也可以解决 JavaScript 浮点数计算的精度问题。 npm install big.js const Big require(big.js);const a new Big(0.1); const b new Big(0.2); const result a.plus(b); // 使用 Big.js 进行加法运…

PyCharm 无法运行的解决方案

问题: PyCharm 无法运行,该怎么办? 解决方案: 1. 检查 Python 解释器 确保已为 PyCharm 配置正确的 Python 解释器。打开 PyCharm,转到“文件”>“设置”>“项目”>“Python 解释器”。选择所需的 Python …

英语六级常用词汇2

英语六级常用词汇1 blush [blʌʃ] 脸红(名词、动词):面部因羞愧、激动或尴尬而变红。Example: She began to blush when they complimented her.翻译: 当他们称赞她时,她开始脸红。 pedal [ˈpɛdəl] 踏板&#xff…

数组和指针经典笔试题讲解下

目录 创作不易,如对您帮助,还望一键三连,谢谢!!! 题目一: 题目二: 题目三: 题目四: 题目五: 题目六: 题目七: 创作…

在 Ubuntu 下使用 clash-for-linux-backup

记录一下如何在 Ubuntu(其它带bash的Linux应该都可以)下运行Clash 有人已经制作了方便使用的脚本, 仓库为 https://github.com/Elegycloud/clash-for-linux-backup, 直接使用这个仓库就可以了. clone 这个仓库 https://github.com/Elegycloud/clash-for-linux-backup 到本地 …

震惊!某省图书馆竟然可以注册后直接访问知网并下载文章?

四川省图书馆 使用说明 1.点击进入https://portal.sclib.org/interlibSSO/main/main.jsp 显示如下: 2.关注四川省图书馆公众号并注册 3.点击馆外登录并使用刚注册的用户名密码登录 显示如下: 4.登录成功后跳转至首页并点击cnki即可正常使用

2024年最新一线互联网企业高级软件测试工程师面试题大全

1、功能测试 功能测试是游戏测试中跟“玩游戏”最相关的一个环节。 当然这里的“玩”不是要真的让你感受快乐,而是要通过“玩”游戏,发现存在的问题或不合理的地方。因此,这个“玩”的过程基本不会感受到游戏的乐趣。事实上,每一次…

BIO NIO AIO有什么区别?

通俗易懂地解释这些东西是我的风格, BIO就是阻塞io,就是一个程序在发出io请求之后不能干任何别的事,只能等待请求,不断检测io的状态,只有接受到反馈之后才能干别的事 适用场景: 用作请求少而且连接时间短的情况 NIO就是非阻塞,也就是没有阻塞,怎么没有阻塞了?说白了就是发出…

低代码+定制物资管理:创新解决方案探析

引言 在当今快速变化的商业环境中,企业面临着不断增长的挑战,如提高效率、降低成本、满足客户需求等。为了应对这些挑战,企业需要不断创新并采用先进的技术解决方案。在这样的背景下,低代码开发和定制化物资管理成为了引领企业变…

管理情绪方法中篇【三分法、整理自己的观念合理、人活着要有弹性】

是 VS 非、成功 VS 不成功 二分法 逃出二分法【二合一,三分法】:不公平才是公平,公平才是不公平 有弹性回答: 1、好像还不错 2、到时在看看,有弹性 3、没有意见,我突然想到一个意…

【3GPP】【核心网】【5G】5G核心网协议解析(四)(超详细)

1. 欢迎大家订阅和关注,精讲3GPP通信协议(2G/3G/4G/5G/IMS)知识点,专栏会持续更新中.....敬请期待! 目录 1. NGAP 按流程功能分类 1.1 接口管理过程 1.1.1 NG Setup 1.2.1 NAS消息传输过程 Transport of NAS Messa…

Android 14设置android:importantForAutofill=“no“无效

密码输入框EditText不希望弹出Google的是否保存密码弹出框, 直接设置了android:importantForAutofill"no", android:inputType"textPassword|textNoSuggestions"在安卓12手机上有效,但是在安卓14上面就不行了&#xff0…

记一次JSON.toJSONString()转换时非属性方法空指针异常排查及toJSONString保留null值属性

记一次JSON.toJSONString()转换时非属性方法空指针异常排查及toJSONString保留null值属性 异常详情 有一个类,里面有两个属性和一个类似工具的getRealName()方法如下: getRealName()方法就是获取这个人的真实名字,如果获取不到就以name返回…

堆的介绍,实现,使用(c语言实现)

目录 堆的概念 堆的性质: 堆的分类 父子结点的下标关系 堆的向下调整算法 ​编辑小堆 大堆 建堆 堆的向上调整算法 小堆 大堆 堆的基本操作 定义堆 初始化堆 销毁堆 打印堆 堆的插入 堆的删除 大堆(Max Heap)的向下调整算法…

jadx反编译apk

ref:https://github.com/skylot/jadx jadx是一款反编译利器,同时支持命令行和图形界面,能以最简便的方式完成apk的反编译操作。 安装: 1.windos: https://github.com/skylot/jadx/releases/tag/v1.2.0 下载jadx-1.…

Java 设计模式(上)

目录 一、单一职责原则 二、开闭原则 三、里氏替换原则 四、迪米特法则 五、接口隔离原则 六、依赖倒置原则 七、工厂方法 八、抽象工厂 九、建造者模式 十、原型模式 十一、单例模式 十二、适配器模式 一、单一职责原则 单一职责原则又称单一功能原则,…

【Redis 开发】分布式锁中的常见问题和Lua脚本

分布式锁中的问题 分布式锁中我们设置的过期时间: 如果有一个线程获取锁之后在进行操作时,到达了锁的过期时间,之后就会有别的线程获得锁,如果这时,第一个线程执行完成后释放锁,就会将第二个锁的线程删除 …

回溯-单词搜索

给定一个 m x n 二维字符网格 board 和一个字符串单词 word 。如果 word 存在于网格中,返回 true ;否则,返回 false 。 单词必须按照字母顺序,通过相邻的单元格内的字母构成,其中“相邻”单元格是那些水平相邻或垂直相…