一. 简介
Elasticsearch是一个搜索引擎,它底层是基于Lucene来实现的。
Lucene是一个Java库,它存在着一定的问题,如果项目的开发语言不是Java,那么是无法使用 Lucene;Lucene底层设计非常的复杂,需要深入的了解搜索相关的知识,才能用好它。
Elaticsearch它是完全基于Restful风格的API来使用,那么就不在局限于任何一门语言,都可以直接调用接口即可实现搜索服务。
二. 倒排索引和前向索引(正排索引)
****分词就是将一句话或者一段话,按照某个语义拆分为一个个的字或者词的过程。例如:
2.1 前向索引
前向索引在数据库领域用的很多,例如 MySQL的全文检索。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-6L89unqV-1678946462776)(images/前向索引.jpg)]
2.2 倒排索引
搜索引擎中都是使用这种方式
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-iR9NMoeR-1678946462778)(images/倒排索引.jpg)]
2.3 总结
前向索引,每个文档都有一个文档的编号,每个文档的编号对应着该文档的分词信息,用户在搜索匹配的时候,根据文档编号找到该文档对应的分词,去进行分词的匹配,如果有匹配的分词,那么该文档就在最终的结果集中,所以它查询的效率会很低,但是其分词构建索引过程较快,因为每个文档的分词都是独立的。
倒排索引,文档在写入搜索引擎的时候,对文档进行分词,将字典中已经存在的分词直接与文档进行映射,没有的分词,先添加到字典中,然后再映射。用户在搜索匹配的时候,直接到分词字典中去匹配,匹配到之后,将映射到该分词的文档提取出来,这种方式查询效率高,可以作相关性算分。
三. ES与Kibana的安装
3.1 ES的安装
Elasticsearch是整个 elastic 产品栈的核心,数据的存储、分词、搜索都是通过 Elasticsearch来完成。
通过 docker安装,直接执行如下命令即可:
验证ES是否安装成功,在浏览器输入:http://ip:9200
3.2 Kibana的安装
Kibana是ES的可视化操作界面,安装方式如下所示:
验证Kibana是否安装成功,在浏览器输入: http://ip:5601
3.3 logstash导入数据
要进入到logstash的bin目录下,打开dos命令行,导入数据使用如下的命令:
logstash的内容如下所示:
四. ES的基本概念
我们类比 RDBMDS 来熟悉ES的一些基本概念:
在ES中三层含义:
- 索引,数据集;
- 索引,将数据写入到ES的过程叫做索引。
- 倒排索引。
五. ES的基本增删改
查看所有的索引
添加数据
指定id添加数据
添加数据,如果存在就报错
更新文档的结构
删除数据
根据id查询数据
查看部分数据
查看数据总量
六. Request Body查询
查询电影名字中包含有 seconds 的所有的电影
查询电影的名字中包含有 beautiful 或者 mind所有的电影
查询电影的名字中包含有 beautiful 和 mind所有的电影
查询电影的名字中包含有 "beautiful mind"这个短语的所有的电影
如果某个字段的数据是 keyword 类型,就是做等值比较, 最好使用 term查询(term是标准的比较)
查询电影在 [2000, 2002] 年上映的所有的电影
查询电影的名字中包含有 beautiful 或者 mind,而且上映时间在 [2000, 2003] 所有的电影,多条件查询的结构如下所示:
查询电影的名字和类型中包含有 Romance 所有的电影
查询电影名字中包含有 seconds 所有的电影,但是只查询id和title着两个属性的内容
查询电影名字中包含有 seconds 所有的电影,属性都不看
七. 前缀匹配
前缀匹配是一个网站中使用频率非常高的一个功能,而且在添加和删除字符的时候都会向服务器端发送请求,对服务器和ES都是一个挑战,所以ES针对这种前缀匹配,专门设计了一个数据类型 。如果某个属性的数据类型是 ,只能进行前缀匹配,并且ES会将查询的数据放到缓存中,如果接着有其他用户进行相同的前缀匹配的时候,会直接从内存中查找。
ES中一旦某个索引中有数据了,我们是不能调整它的 mapping 信息,所以在ES中要向指定某个属性的数据类型的时候,需要先设定mapping.
7.1 设计mapping的思路
- 预先构思好索引中要存放什么数据,说白了就是有哪些属性
- 利用ES本身的能力(写入数据的时候,会自动创建mapping),写入一个样例数据,让ES帮我们创建好mapping.
- 查询mapping,按照我们的需求做出适当的调整
- 将之前的索引删掉,将修改之后的mapping添加到ES中。
- 导入正规数据
- 验证前缀匹配
八. Analysis分词
Analysis是分词,它内部是通过分词器(analyzer)来完成,。
Analyzer在整个分词的过程中,经过三个流程:
- character filter,将内容的信息进行过滤
- tokenizer,将全文本进行分词处理
- token filter,去掉分词之后的停用词,然后将其他内容转小写
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-suLcQp15-1678946462779)(images/Analyzer.jpg)]
8.1 ES内置的分词器
ES内置的分词器只能对英文进行分词处理,ES内置的分词器有:
- whitespace
- stop
- standard
- simple
验证某个分词器的分词效果:
8.2 IK和pinyin分词器的使用
8.2.1 IK的安装
IK是目前社区用的最多一款中文分词器,它内部包含了两个分词器,和 , 下载地址:https://github.com/medcl/elasticsearch-analysis-ik/releases
安装的方式:解压到 目录下即可。需要注意的是,要使用一个文件夹将其包裹起来,因为ik分词器解压之后没有文件夹包裹的。
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-nSx5XLwL-1678946462779)(images/ik.jpg)]
ik分词的验证:
8.2.2 pinyin的安装
pinyin就是将中文转换为拼音的方式,下载地址:https://github.com/medcl/elasticsearch-analysis-pinyin/releases?page=7
安装的方式:解压到 目录下即可。pinyin分词器是有文件夹包裹的。
九. 中文、pinyin前缀搜索
- 因为ik、pinyin他们并没有提供的完善的拼音+汉字的前缀搜索,需要在pinyin分词器的基础上定制
- 自定义分词器
- 定义mapping
- 插入数据
插入数据之后,在倒排索引的字典中会有如下的分词结果:
- 执行搜索
“刘德华”
}
POST users/_doc/2
{
“id”: 2,
“name”: “柳宗元”
}
POST users/_doc/3
{
“id”: 3,
“name”: “柳岩”
}
POST users/_doc/4
{
“id”: 4,
“name”: “李思思”
}
POST users/_doc/5
{
“id”: 5,
“name”: “李小路”
}
POST users/_doc/6
{
“id”: 6,
“name”: “李小小”
}
刘德华
ldh
liudehua
柳宗元
liuzongyuan
lzy
柳岩
liuyan
ly
李思思
lisisi
lss
李小路
lxl
lixiaolu
李小小
lxx
lixiaoxiao