目录
一、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的概念做一下对比:
MySQL | Elasticsearch | 说明 |
---|---|---|
Table | Index | 索引(index),就是文档的集合,类似数据库的表(table) |
Row | Document | 文档(Document),就是一条条的数据,类似数据库中的行(Row),文档都是JSON格式 |
Column | Field | 字段(Field),就是JSON文档中的字段,类似数据库中的列(Column) |
Schema | Mapping | Mapping(映射)是索引中文档的约束,例如字段类型约束。类似数据库的表结构(Schema) |
SQL | DSL | DSL是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 | 配置文件目录 |
jdk | JAVA工具包 |
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 ik
unzip 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