Elasticsearch(全文搜索引擎)

   日期:2024-12-26    作者:aezjt 移动:http://ljhr2012.riyuangf.com/mobile/quote/55375.html

一. 简介

​ Elasticsearch是一个搜索引擎,它底层是基于Lucene来实现的。

Elasticsearch(全文搜索引擎)

​ 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的一些基本概念

RDBMSElasticsearch数据库索引表type(在ES7之后,一个索引中只有一个type,叫做 )记录文档(一个JSON对象)字段属性schemamapping

在ES中三层含义

  1. 索引,数据集
  2. 索引,将数据写入到ES的过程叫做索引。
  3. 倒排索引。

五. 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的思路
  1. 预先构思好索引中要存放什么数据,说白了就是有哪些属性
  1. 利用ES本身的能力(写入数据的时候,会自动创建mapping),写入一个样例数据,让ES帮我们创建好mapping.
  1. 查询mapping,按照我们的需求做出适当的调整
 
  1. 将之前的索引删掉,将修改之后的mapping添加到ES中。
 
  1. 导入正规数据
  1. 验证前缀匹配
 

八. Analysis分词

​ Analysis是分词,它内部是通过分词器(analyzer)来完成

​ Analyzer在整个分词的过程中,经过三个流程

  1. character filter,将内容的信息进行过滤
  2. tokenizer,将全文本进行分词处理
  3. token filter,去掉分词之后的停用词,然后将其他内容转小写

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-suLcQp15-1678946462779)(images/Analyzer.jpg)]

8.1 ES内置的分词器

ES内置的分词器只能对英文进行分词处理,ES内置的分词器有

  1. whitespace
  2. stop
  3. standard
  4. 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前缀搜索

  1. 因为ik、pinyin他们并没有提供的完善的拼音+汉字的前缀搜索,需要在pinyin分词器的基础上定制
  1. 自定义分词器
 
  1. 定义mapping
 
  1. 插入数据
 

插入数据之后,在倒排索引的字典中会有如下的分词结果

 
  1. 执行搜索
 

“刘德华”
}

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


特别提示:本信息由相关用户自行提供,真实性未证实,仅供参考。请谨慎采用,风险自负。


举报收藏 0评论 0
0相关评论
相关最新动态
推荐最新动态
点击排行
{
网站首页  |  关于我们  |  联系方式  |  使用协议  |  隐私政策  |  版权隐私  |  网站地图  |  排名推广  |  广告服务  |  积分换礼  |  网站留言  |  RSS订阅  |  违规举报  |  鄂ICP备2020018471号