Es介绍
1.场景
-
京东、淘宝等电商搜索
-
搜索手机壳
- 能够搜索到手机壳、手机等商品数据
- 搜索到内容还有高亮显示
- 还能搜索到手机相关的品牌数据等
-
-
百度、Google等搜索引擎搜索
-
掘金、CSDN、博客园等论坛搜索
-
打车软件搜索附近的车
2、ES介绍
-
2.1、概述
-
一款非常强大的开源搜索引擎,能够实现在海量数据中快速检索到满足条件的数据,同时还可以实现分页、高亮显示等功能
-
其他功能
- 日志统计、分析、系统监控等
-
-
2.2、ELK技术栈
-
Elasticsearch
- 存储、搜索、分析数据
-
Kibana
- 数据可视化
- 提供了图形化界面,可以操作ES
-
Logstash、Beats
- 数据抓取
-
-
2.3、相关产品
-
lucene
-
是Apache的开源搜索引擎类库,提供了搜索引擎的核心API,由Java语言开发
-
ES底层是基于lucene来实现的
-
官网
-
-
Solr
-
ES流行之前最火的开源搜索引擎
- 底层也是lucene
-
ES在搜索实时数据的性能要强于Solr
-
-
3、倒排索引
- 3.1、ES实现快速搜索功能的核心概念
- 3.2、正向索引
- 先通过文件名找到具体的文件,再获取文件中的内容过程
- mysql的查询功能就是正向索引的思想
- 先根据ID查询记录,再从记录中获取相关字段的数据
- 3.3、倒排索引
- 1、概述
- 从文件的内容查找,得到包含这些内容的文件列表,再得到文件对应的信息,如文件名、作者、文件大小、创建时间等
- 2、过程
- 1、将文档的内容通过算法进行分词,得到一个词条列表
- 2、将词条列表当作key,包含该词条的文档id列表作为值,形成一张表
- 原始文档
-
- 词条表
-
- 3、词条是唯一的,所以给词条创建索引,提高搜索效率
- 4、通过词条查询,得到文档ID,再通过文档ID查询到具体的文档
- 3、总结
- 把文档内容进行分词,得到一个词条表【词条:文档ID列表】,给词条创建索引。把要搜索的内容进行分词,根据分词后的结果去词条表中根据词条进行匹配,得到文档ID列表,再通过文档ID返回具体的文档信息
- 3.4、整个搜索过程分为如下几步
- 对搜索的内容进行分词
- 基于内容搜索到相关的文档ID
- 再通过文档ID找到对应的文档
- 展示你要展示的文档数据
4、ES相关概念对比MySQL
5、安装ES、Kibana、IK分词器
- 5.1、安装ES
- 1、创建网络
- docker network create es-net
- 查看网络
- docker network ls
- 如果网络已经存在,则不用创建
- 2、导入es.tar
- docker load -i tar包位置
- 3、安装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
- 5.2、安装Kibana
- 导tar包
- docker run -d \ --name kibana \ -e ELASTICSEARCH_HOSTS=http://es:9200 \ --network=es-net \ -p 5601:5601 \ kibana:7.12.1
- 5.3、测试
- 访问ES
-
- 访问Kibana,并进入 Dev Tools
-
-
-
- 5.4、测试IK分词器
- 1、标准分词器的分词效果
- -
- 2、安装
- 查看es插件数据卷挂载位置
- docker volume inspect es-plugins
-
- ES插件目录
- /var/lib/docker/volumes/es-plugins/_data
- 把 资料\ik 目录复制到 ES插件目录 下
- 重启ES让插件生效
- 3、分词方式
- ik_smart
- 粗粒度
- 拆分结果少
- ik_max_word
- 细粒度
- 拆分结果多
-
- 4、扩展词典
- 一些网络红词,以前不是词,现在因为网络太发达,已经变成了词,譬如:奥利给、卷王
- 配置
- ik\config\ext.dic
- 写上要扩展的词,一个词占一行,必须UTF-8编码
- 重启ES生效
- 5、停用词典
- 一些不好的词,例如对国家不友好的词,这里就不打比方了
- 配置
- ik\config\stopword.dic
- 写上要停用的词,一个词占一行,必须UTF-8编码
- 重启ES生效
- 6、在 IkAnalyzer.cfg.xml 文件中查看是否开启扩展词和停用词
6.索引库操作
- 1、概述
- 存放文档的表
- 相当于数据库表
- 2、mapping映射
- 2.1、是对索引库中文档的约束
- 1、指定字段的类型、分词器、是否索引、是否存储等信息
- 2、字段类型
- type
- https://www.elastic.co/guide/en/elasticsearch/reference/7.12/mapping-types.html
- 字符串
- text(可分词的文本)
- 文章标题
- 商品标题
- 小说内容
- 小说介绍
- keyword(精确值,不分词)
- 例如:品牌、国家、作者、ip地址
- 数值
- long、integer、short、byte、double、float
- 布尔
- boolean
- 日期
- date
- 对象
- object
- 位置
- 经纬度
- geo_point
- 3、分词器
- analyzer
- 针对要分词的字段
- 一般就是text
- 一般都会选择 ik_max_word、ik_smart
- 4、是否索引
- index
- 针对要搜索的字段
- 例如:商品标题、商品价格
- 不需要搜索的字段:商品图片
- 默认是true
- 5、是否存储
- store
- 针对是否要展示给用户看
- 小说内容,不存储
- 默认是true
- 2.2、相当于数据库表的约束
3、创建索引库并指定mapping
-
PUT /索引库名
- #创建索引 PUT /[名字] { "mappings": { "properties": { "info":{ "type": "text", "analyzer": "ik_smart", "index": true, "store": true }, "email":{ "type": "text", "analyzer": "ik_max_word" }, "brand":{ "type": "keyword" }, "name":{ "properties": { "firstName":{ "type":"keyword" }, "lastName":{ "type":"keyword" } } }, "birth":{ "type": "date", "format": "yyyy-MM-dd" } } } }
4、查询索引库
- GET /索引库名
5、修改索引库
- 索引库,一旦创建,无法修改。但是可以向其中增加字段
- 增加字段
- PUT /索引库名/_mapping
-
-
6、删除索引库
- DELETE /索引库名