elasticsearch是一款非常强大的开源搜索引擎,可以帮助我们从海量数据中快速找到需要的内容。
elasticsearch结合kibana、Logstash、Beats,也就是elastic stack(ELK)。被广泛应用在日志数据分析、实时监控等领域。
什么是elasticsearch?
一个开源的分布式搜索引擎,可以用来实现搜索、日志统计、分析、系统监控等功能
什么是elastic stack(ELK)?
是以elasticsearch为核心的技术栈,包括beats、Logstash、kibana、elasticsearch
什么是Lucene?
是Apache的开源搜索引擎类库,提供了搜索引擎的核心API
传统数据库(如MySQL)采用正向索引,例如给下表(tb_goods)中的id创建索引:
elasticsearch采用倒排索引:
文档:每条数据就是一个文档
词条:文档按照语义分成的词语
词条词典(Term Dictionary):记录所有词条,以及词条与倒排列表(Posting List)之间的关系,会给词条创建索引,提高查询和插入效率
倒排列表(Posting List):记录词条所在的文档id、词条出现频率 、词条在文档中的位置等信息
文档id:用于快速获取文档
词条频率(TF):文档在词条出现的次数,用于评分
什么是正向索引?
基于文档id创建索引。查询词条时必须先找到文档,而后判断是否包含词条
什么是倒排索引?
对文档内容分词,对词条创建索引,并记录词条所在文档的信息。查询时先根据词条查询到文档id,而后获取到文档
elasticsearch是面向文档存储的,可以是数据库中的一条商品数据,一个订单信息。 文档数据会被序列化为json格式后存储在elasticsearch中。
相同类型的文档的集合
索引中文档的字段约束信息,类似表的结构约束
Mysql:擅长事务类型操作,可以确保数据的安全和一致性
Elasticsearch:擅长海量数据的搜索、分析、计算
1、创建网络
因为我们还需要部署kibana容器,因此需要让es和kibana容器互联。这里先创建一个网络:
docker network create es-net
2、加载镜像
去dockerHub上边或者自己加载镜像都是可以的,需要注意的是这两者的版本需要一致。
3、运行 需要注意的是你需要将版本换成你自己的,可通过docker images查看
运行es
docker run -d \ --name es \ -e "ES_JAVA_OPTS=-Xms512m -Xmx512m" \ -e "discovery.type=single-node" \ -v es-data:/usr/share/elasticsearch/data \ -v es-plugins:/usr/share/elasticsearch/plugins \ --privileged \ --network es-net \ -p 9200:9200 \ -p 9300:9300 \ elasticsearch:7.12.1
解释
- -e "cluster.name=es-docker-cluster"`:设置集群名称 - -e "http.host=0.0.0.0"`:监听的地址,可以外网访问 - -e "ES_JAVA_OPTS=-Xms512m -Xmx512m"`:内存大小 - -e "discovery.type=single-node"`:非集群模式 - -v es-data:/usr/share/elasticsearch/data`:挂载逻辑卷,绑定es的数据目录 - -v es-logs:/usr/share/elasticsearch/logs`:挂载逻辑卷,绑定es的日志目录 - -v es-plugins:/usr/share/elasticsearch/plugins`:挂载逻辑卷,绑定es的插件目录 - --privileged`:授予逻辑卷访问权 - --network es-net` :加入一个名为es-net的网络中 - -p 9200:9200`:端口映射配置
部署成功可通过ip+9200访问
运行kibana
docker run -d \ --name kibana \ -e ELASTICSEARCH_HOSTS=http://es:9200 \ --network=es-net \ -p 5601:5601 \ kibana:7.12.1
解释
- --network es-net` :加入一个名为es-net的网络中,与elasticsearch在同一个网络中 - -e ELASTICSEARCH_HOSTS=http://es:9200"`:设置elasticsearch的地址,因为kibana已经与elasticsearch在一个网络,因此可以用容器名直接访问elasticsearch - -p 5601:5601`:端口映射配置
部署成功可通过ip+5601访问,进入DevTools界面进行编程。
es在创建倒排索引时需要对文档分词;在搜索时,需要对用户输入内容分词。但默认的分词规则对中文处理并不友好。
# 进去容器内部 docker exec -it elasticsearch /bin/bash#在线下载并安装 ./bin/elasticsearch-plugin install https://github.com/medcl/elasticsearch-analysis-ik/releases/download/v7.12.1/elasticsearch-analysis-ik-7.12.1.zip#退出
exit# 重启
docker restart elasticsearch
#查看数据卷目录 docker volume inspect es-plugins#上传ik分词器到es容器的插件数据卷中#重启
docker restart es
ik分词器包含两种模式:
ik_smart:最少切分,粗粒度
ik_max_word:最细切分,细粒度
要拓展ik分词器的词库,只需要修改一个ik分词器目录中的config目录中的IkAnalyzer.cfg.xml文件:
添加后创建文件添加扩展词语即可。
需要重启。
分词器得作用:
创建倒排索引时对文档分词
用户搜索时,对输入的内容分词
IK分词器得模式
ik_smart:智能切分,粗粒度
ik_max_word:最细切分,细粒度
如何拓展词条、停用词条
利用config目录的IkAnalyzer.cfg.xml文件添加拓展词典和停用词典
在词典中添加拓展词条或者停用词条