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,一经查实,立即删除!

相关文章

Matlab绘图经典代码大全:条形图、极坐标图、玫瑰图、填充图、饼状图、三维网格云图、等高线图、透视图、消隐图、投影图、三维曲线图、函数图、彗星图

学会 MATLAB 中的绘图命令对初学者来说具有重要意义,主要体现在以下几个方面: 1. 数据可视化。绘图命令是 MATLAB 中最基本也是最重要的功能之一,它可以帮助初学者将数据可视化,更直观地理解数据的分布、变化规律和趋势。通过绘制图表,可以快速了解数据的特征,从而为后续…

?你咋知道我的电脑密码的?---> 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…

MySQL进阶查询篇(6)-锁的种类与应用场景

MySQL是一个常用的关系型数据库管理系统。在多用户并发访问数据库时&#xff0c;为了确保数据的一致性和完整性&#xff0c;MySQL提供了多种锁机制。本文将介绍MySQL数据库中的锁的种类与应用场景。 1.悲观锁&#xff08;Pessimistic Lock&#xff09; 悲观锁是在进行数据读取…

【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…

Android java基础知识

一.Android java基础知识 第一个java程序Hello Worid&#xff1a; public class Hello {public static void main(String args[]) {System.out.println("Hello, world!");} }运行结果&#xff1a; rootubuntu:/home/topeet/guyilian# javac Hello.java rootubuntu…

使用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…

Java面向对象 访问控制权限

目录 访问控制权限继承多态组合代理向上转型staticfinal 访问控制权限 访问控制权限⼜称为封装 &#xff0c;它是⾯向对象三⼤特性中的⼀种&#xff0c;我之前在学习过程中经常会忽略封装&#xff0c;⼼想这不就是⼀个访问修饰符么&#xff0c;怎么就是三⼤特性的必要条件了&a…

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下载地…

Python DNS操作详解

在网络世界中&#xff0c;DNS&#xff08;Domain Name System&#xff09;扮演着重要的角色&#xff0c;它是一种分布式数据库系统&#xff0c;用于将域名&#xff08;如 google.com&#xff09;转换为相应的 IP 地址&#xff08;如 172.217.7.206&#xff09;。DNS 可以被视为…

【Flink】SQL-CLIENT中出现 Could not find any factory for identifier ‘kafka‘

在Flink的sql-client客户端中执行sql代码时出现如下错误,版本Flink1.13.6 [ERROR] Could not execute SQL statement. Reason: org.apache.flink.table.api.ValidationException: Could not find any factory for identifier kafka that implements org.apache.flink.table.fa…

nginx: [error] invalid PID number ““ in “/usr/local/nginx/logs/nginx.pid“

问题描述 执行nginx -s reload时&#xff0c;出现如下错误 [rootiZuf65h6i43ltlzhqolumyZ conf]# ../sbin/nginx -s reload nginx: [error] invalid PID number "" in "/usr/local/nginx/logs/nginx.pid"解决办法 因为每一个nginx进程都对应一个id&…

配置ARM交叉编译工具的通用步骤

ARM交叉编译工具是用于编译在ARM架构上运行的代码的工具。这些工具允许开发者在一种架构&#xff08;通常是x86或x64&#xff09;上编写和编译代码&#xff0c;然后将其移植到ARM架构上运行。 ARM交叉编译工具链通常包括编译器、链接器、调试器和其他必要的工具&#xff0c;用…

【开源】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 数据库设…