ElasticSearch之倒排索引

写在前面

本文看下es的倒排索引相关内容。

1:正排索引和倒排索引

正排索引就是通过文档id找文档内容,而倒排索引就是通过文档内容找文档id,如下图:
在这里插入图片描述

2:倒排索引原理

假定我们有如下的数据:
在这里插入图片描述
为了建立倒排索引,我们需要先对文档进行分词,如下:
在这里插入图片描述
分词后每一个词有一个专门的名词来表示,叫做Term,term就是我们要搜索的目标,但是找到了term并不能找到文档,为了找到文档,每一个term对应一个[<文档id,偏移量,出现次数>]的数组,这个数组我们叫做Posting List,其中每个term对应一个Posing List,如下图:
在这里插入图片描述
为了方便查找term,term+Posing List组合在字典的数据结构,叫做Term Dictionary(注意term是排好序的,所以可以顺序查找,后面会用到!!!),如下图:
在这里插入图片描述
这样,当我们搜索Elasticsearch,可以通过Term Disctionary,查到对应的term,然后通过term就可以找到对应的PosingList,就找到文档了,这个过程如下:
在这里插入图片描述
但,实际上我们搜索的关键词,是没有办法直接按照上述流程找到term的,因为term dictionary比较大,是保存在磁盘上的,直接基于磁盘查找,速度就可想而知了,所以,es还设计了另外一种数据结果term index,用来在内存中保存关键词对应的term磁盘页位置,term index是一种基于trie tree的数据结构,大概如下图:
在这里插入图片描述
其中红色的就是位置信息,但是注意在term index中只会存储前缀,所以可以定位到一个大概的位置,而因为term是顺序存储的,所以可以顺序读盘,找到目标term,这里我们简单的以直接定位到term为例看下这个过程:
在这里插入图片描述
最后,es为了能够将term index存储在内存中,还是用了FST的算法,来压缩空间。则最终查找过程就如下图了:
在这里插入图片描述

以上过程分词是及其重要的一个环节,所以我们接下来也来看下分词相关的内容。

3:分词

3.1:什么是分词和分词器

分词:analysis,即将一句话分为多个词(term)的过程。

分词器:analyzer,完成分词这个操作的工具。

如下图:

在这里插入图片描述

所以,分词是个动词,分词器是个名词。

分词器在我们写入数据构建倒排索引的时候会用到,在输入一句话进行搜索的时候也会用到。

3.2:分词器的工作原理

一个标准的分词器由以下三部分组成:

Charancter Filters:对原始的内容进行处理,如删除html字符,等
Tokenizer:按照某种规则切分为一组单词(term),这部分功能不仅每种分词器都有,而且还可能包含Token Filters的功能(可以看作是分词器的非标准实现)
Token Filters:对切分后的次进行处理,如转小写,删除停用词等

如下简单例子:
在这里插入图片描述

注意这只是一个标准的分词器需要具备的三个部分,但除了Tokennizer必须提供具体的实现外,Chracter Filters和Token Filters并不是必须提供实现的。

3.3:分词器都有哪些

在这里插入图片描述
为了方便你我们查看不同的分词效果,es提供了_analysis 的rest api,如下:
在这里插入图片描述

3.3.1:Standard Analyzer

默认分词器,标准分词器三部分提供如下:

charanter Filters:无
Tokennizer:按词切分,就是按照空格切分吧
Token Filters:小写处理

如下图:
在这里插入图片描述
首先,我们来看下standard analyzer的执行效果:
在这里插入图片描述
可以看到只是空格划分后转小写了。
如果我们想要启动token fitlers中的停用词该怎么办呢?可以这样,我们来自定义一个分词器,并指定配置,因为在es中自定义分词需要定义在索引下,所以我们需要指定索引来创建(其实就是设置索引的setting),如下:

PUT standard_analyzer_token_length_conf1_index
{"settings": {"analysis": {"analyzer": {"english_1analyzer":{"type":"standard","max_token_length":5,"stopwords":"_english_"}}}}
}

在这里插入图片描述
在索引standard_analyzer_token_length_conf1_index中我们定义了一个名称为english_1analyzer的自定义索引,其中的配置项如下:

"type":"standard",基于standard分词器
"max_token_length":5,token最大长度为5,即如果term长度大于5则回分为2个,如ABCDEFGHI,会分为ABCDE和FGHI
"stopwords":"_english_"使用标准的eglish停用词语,也可以通过stopwords_path来指定停用词

测试如下:
在这里插入图片描述
可以看到is a这些就没了,并且每个term的最大长度是5,超过5的也被分成了多个。

3.3.2:Simple Analyzer

简单分词器,标准分词器三部分提供如下:

Charanter filters:不提供实现
Tokennizer:按照非字母进行切分(可对比standard分词器只按照空格进行切分),然后还抢了本该属于Token Filters的活,会转小写
Token filters:不提供实现

在这里插入图片描述
测试如下:
在这里插入图片描述

3.3.3:White space Analyzer

空格分词器,标准分词器三部分提供如下:

Character Filters:不提供实现
Tokenizer:按照空格切分(简单粗暴)
Token Filters:不提供实现

v
测试如下:
在这里插入图片描述

3.3.4:stop anylizer

停用词分词器,标准分词器三部分提供如下:

Character Filters:不提供实现
Tokenizer:按照空格切分
Token Filters:删除is,a等修饰词

可以看到相比于simple analyzer,只是多了tokenfilters的删除修饰词功能。
在这里插入图片描述
测试如下:
在这里插入图片描述

3.3.5:keyword anylizer

关键词分词器,标准分词器三部分提供如下:

Charater Fitlers:不提供实现
Tokennizer:原样输出,也是一种特殊的分割,不是嘛!!!
Token Filters:不提供实现

在这里插入图片描述
测试如下:
在这里插入图片描述

3.3.6:Pattern anylizer

模式分词器,标准分词器三部分提供如下:

Character Fiters:不提供实现
Tokennizer:默认按照\W+进行分割,即按照[0-9a-zA-Z_]之外的字符进行分割
Token Fiters:转小写,以及停用词

在这里插入图片描述
测试如下:
在这里插入图片描述

3.3.7:language anylizer

这并不是一个分词器,而是一组分词器,一组针对特定语言的分词器,支持语言如下:
在这里插入图片描述
以english为例看下,其token filters还会将一些特定语态的单词变为正常的,如xxxIng变为xxx,如:
在这里插入图片描述

3.3.8:中文分词

因为中华文字,博大精深,变化多端,所以分词的难度相当之大,具体点如下:
在这里插入图片描述
为了测试中文分词我们可以来自定义一个安装了ik插件的新镜像,参考docker自定义镜像并使用 。只需要将docker-compose中的es imga改成我们自己定义的就可以测试了,如:
在这里插入图片描述

3.3.9:自定义分词器

https://blog.csdn.net/weixin_28906733/article/details/106610972 如果希望自定义一个与standard类似的analyzer,只需要在原定义

  • 自定义一个与standard类似的analyzer
    先再来看下standard分词器:
charanter Filters:无
Tokennizer:按词切分,就是按照空格切分吧
Token Filters:小写处理

定义和使用:

//测试自定义analyzer
PUT custom_rebuild_standard_analyzer_index
{"settings": {"analysis": {"analyzer": {"rebuild_analyzer":{"type":"custom","tokenizer":"standard","filter":["lowercase"]}}}}
}//测试请求参数
POST custom_rebuild_standard_analyzer_index/_analyze
{"text": "transimission control protocol is a transport layer protocol"
}
  • 自定义一个与simple类似的analyzer
    先再来看下simple分词器:
Charanter filters:不提供实现
Tokennizer:按照非字母进行切分(可对比standard分词器只按照空格进行切分),然后还抢了本该属于Token Filters的活,会转小写
Token filters:不提供实现

测试和使用:

//测试自定义analyzer
PUT custom_rebuild_simple_analyzer_index
{"settings": {"analysis": {"analyzer": {"rebuild_simple":{"tokenizer":"lowercase","filter":[]}}}}
}//测试请求参数
POST custom_rebuild_simple_analyzer_index/_analyze
{"text": "transimission control protocol is a transport layer protocol"
}

写在后面

参考文章列表

Elasticsearch 学习笔记

Elasticsearch是如何做到快速索引的

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/676648.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

?你咋知道我的电脑密码的?---> Mimikatz!

还记得昨天在内网中提到了mimikatz这个工具&#xff0c;那么今天就来和大家讲一下这一款牛逼的工具 但是在这里先祝自己和各位看官新年快乐&#xff0c;万事顺遂 &#x1f409;&#x1f432;&#x1f432;&#x1f432;&#x1f432; 1.Mimikatz的介绍 传说呢&#xff0c;是…

学习通考试怎么搜题找答案? #学习方法#微信#其他

大学生必备的做题、搜题神器&#xff0c;收录上万本教材辅助书籍&#xff0c;像什么高数、物理、计算机、外语等都有&#xff0c;资源十分丰富。 1.菜鸟教程 菜鸟教程是一个完全免费的编程学习软件。 它免费提供了HTML / CSS 、JavaScript 、服务端、移动端、XML 教程、http…

开发JSP应用程序

开发JSP应用程序 问题陈述 TecknoSoft Pvt Ltd.公司的首席技术官(CTO)John Barrett将创建一个应用程序的任务委托给了开发团队,该应用程序应在客户访问其账户详细信息前验证其客户ID和密码。客户ID应是数字形式。John希望如果所输入的客户ID或密码不正确,应向客户显示错误…

Stable Diffusion 模型下载:Disney Pixar Cartoon Type A(迪士尼皮克斯动画片A类)

文章目录 模型介绍生成案例案例一案例二案例三案例四案例五案例六案例七案例八案例九案例十 下载地址 模型介绍 目前还没有一个好的皮克斯迪士尼风格的卡通模型&#xff0c;所以我决定自己制作一个。这是将皮克斯风格模型与我自己的Loras合并在一起&#xff0c;创建一个通用的…

endnotesX9 如何批量导入 .enw文件

文章是用schoolar搜出来 点击下载引用之后&#xff0c;endnotesX9只能一个一个从.enw文件导入&#xff0c;麻烦 —————————————— 可以在schoolar保存到个人图书馆 类似于上面这种&#xff0c;我用的是保存&#xff0c;保存很多的论文之后点我的个人图书馆&#x…

【GO语言卵细胞级别教程】03.条件与循环语句

注意&#xff1a;以下演示所用的项目&#xff0c;在第一章节已经介绍了&#xff0c;这里不做赘述 目录&#xff1a; 【GO语言卵细胞级别教程】03.条件与循环语句1.条件语句1.1 if语句1.1.1 单层if语句1.1.2 if-else语句1.1.3 if-else-if 语句1.1.4 if 嵌套 1.2 switch 语句1.1…

使用CICFlowMeter 实现对pcap文件的特征提取【教程】

使用CICFlowMeter 实现对pcap文件的特征提取【教程】 针对现有的关于CICFlowMeter 的使用教程不够全面&#xff0c;一些细节没有展示&#xff0c;我将结合网络上的相关资料和实际的经历&#xff0c;提供一些经验和建议。 configuration information --------------- Windows…

C++入门学习(二十六)for循环

for (初始化; 条件; 递增/递减) { // 代码块 } 打印1~10&#xff1a; #include <iostream> using namespace std; int main() { for (int i 1; i < 10; i) { cout <<i<<endl; } return 0; } 打印九九乘法表&#xff1a; #include <iostream…

uniapp的配置和使用

①安装环境和编辑器 注册小程序账号 微信开发者工具下载 uniapp 官网 HbuilderX 下载 首先先下载Hbuilder和微信开发者工具 &#xff08;都是傻瓜式安装&#xff09;&#xff0c;然后注册小程序账号&#xff1a; 拿到appid&#xff1a; ②简单通过demo使用微信开发者工具和…

在Linux系统中设置全局HTTP代理的步骤与技巧

在Linux系统中&#xff0c;设置全局HTTP代理可以方便我们统一管理和控制网络请求。这不仅可以帮助我们加速网络访问&#xff0c;还可以在某些情况下绕过网络限制或实现匿名上网。下面&#xff0c;我将为你详细介绍在Linux系统中设置全局HTTP代理的步骤与技巧。 步骤一&#xf…

windows10安装配置nvm以达到切换nodejs的目的

前言 各种各样的项目&#xff0c;各种node环境&#xff0c;还有node_modules这个庞然大物。。想想都觉得恐怖。 所以现在有了&#xff1a;nvm-切换node环境&#xff0c;pnpm–解决重复下载同样类库的问题。 下面将就如何在win10下配置进行说明 nvm下载配置 nvm的github下载地…

【开源】JAVA+Vue+SpringBoot实现班级考勤管理系统

目录 一、摘要1.1 项目介绍1.2 项目录屏 二、功能模块2.1 系统基础支持模块2.2 班级学生教师支持模块2.3 考勤签到管理2.4 学生请假管理 三、系统设计3.1 功能设计3.1.1 系统基础支持模块3.1.2 班级学生教师档案模块3.1.3 考勤签到管理模块3.1.4 学生请假管理模块 3.2 数据库设…

OpenCV 图像处理六(傅里叶变换、模板匹配与霍夫变换)

文章目录 一、傅里叶变换1.1 NumPy实现和逆实现1.1.1 NumPy实现傅里叶变换Demo 1.1.2 NumPy实现逆傅里叶变换Demo 1.2 OpenCV实现和逆实现1.2.1 OpenCV实现傅里叶变换Demo 1.2.2 OpenCV实现逆傅里叶变换Demo 1.3 频域滤波1.3.1低频、高频1.3.2 高通滤波器构造高通滤波器Demo 1.…

Django前后端分离之后端实践

django-admin startproject djweb 生成djweb项目 django-admin startapp news 生成news应用 配置models文件 class NewInfo(models.Model):title models.CharField(max_length30)content models.TextField()b_date models.DateField()read models.IntegerFie…

Blazor Wasm Gitee 码云登录

目录: OpenID 与 OAuth2 基础知识Blazor wasm Google 登录Blazor wasm Gitee 码云登录Blazor SSR/WASM IDS/OIDC 单点登录授权实例1-建立和配置IDS身份验证服务Blazor SSR/WASM IDS/OIDC 单点登录授权实例2-登录信息组件wasmBlazor SSR/WASM IDS/OIDC 单点登录授权实例3-服务端…

ClickHouse--01--简介

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 1. ClickHouse 简介1.1 大数据处理场景1.2 什么是 ClickHouse1.3 OLAP 场景的特征 2. ClickHouse 特性2.1 完备的 DBMS 功能2.2 列式存储行式存储: 在数据写入和修改…

OpenEuler20.03LTS SP2 上安装 OpenGauss3.0.0 单机部署过程(二)

开始安装 OpenGauss 数据库 3.1.7 安装依赖包 (说明:如果可以联网,可以通过网络 yum 安装所需依赖包,既可以跳过本步骤。如果网络无法连通,请把本文档所在目录下的依赖包上传到服务器上,手工安装后,即无需通过网络进行 Yum 安装了): 上传:libaio-0.3.111-5.oe1.x8…

三、搜索与图论

DFS 排列数字 #include<iostream> using namespace std; const int N 10; int a[N], b[N]; int n;void dfs(int u){if(u > n){for(int i 1; i < n; i)cout<<a[i]<<" ";cout<<endl;return;}for(int i 1; i < n; i){if(!b[i]){b[…

自己DIY制作耳机壳一般用哪种材料比较好,性价比比较高

在选择耳机壳的材料时&#xff0c;除了考虑材料本身的性能外&#xff0c;还需要考虑成本、加工难度、耐用性、环保性等方面的因素。 从性能方面来看&#xff1a; 制作耳机壳的UV树脂和塑料材质各有其优缺点。UV树脂具有高硬度、耐磨、耐高温、环保等优点&#xff0c;能够提供更…

【FFmpeg】ffplay 命令行参数 ⑤ ( 设置音频滤镜 -af 参数 | 设置统计信息 -stats 参数 | 设置同步时钟类型 -sync 参数 )

文章目录 一、ffplay 命令行参数 - 音频滤镜1、设置音频滤镜 -af 参数2、常用的 音频滤镜 参数3、音频滤镜链 示例 二、ffplay 命令行参数 - 统计信息1、设置统计信息 -stats 参数2、关闭统计信息 -nostats 参数 三、ffplay 命令行参数 - 同步时钟类型1、设置同步时钟类型 -syn…