兄弟萌,相信大家在学习 Elasticsearch 都听说过倒排索引吧,下面我们尝试用最简单易懂的方式来讲讲 ES 中的倒排索引和分词。

倒排索引建立的是单词和文档 id 的关联关系,建立倒排索引时,首先从文档中拆分出词条,这个过程就是 “分词”。

1.倒排索引

1.1 什么是倒排索引?

我们要搞懂倒排索引,首先来看看什么是正排(正向)索引?

我们知道通过文章 id 可以快速查找到文章内容,之所以检索比较快是因为文章 id 设置为主键,同时生成了主键索引,然后通过主键索引快速关联到存储信息,这种索引就称为 “正排索引”。

欸,看似正排索引能够实现快速检索数据的要求,那为什么需要倒排索引呢?

如果我们想查询文章中包含哪些热门词汇,这时候比较麻烦,我们要做模糊查询,每条数据都要去遍历,因此性能差,而且查找内容的大小写、时态等都会影响查找准确率。

OK,进入正题,看看什么是倒排索引!

我们要换种方式将索引和数据关联,这就需要用到 “倒排索引”。

我们通过关键词来查询主键 id,然后再通过正排索引查询到文章内容。

以前是通过主键 id 关联文章内容,再通过模糊查询找关键字,“倒排索引” 正好和之前相反,所以我们就叫 “倒排索引”。

如:我们要查询 ‘name’ 这个关键词在哪些文档中出现过。首先我们通过倒排索引可以查询到该关键词出现的文档位置是在 1001 和 1002 中,然后再通过正排索引查询到文档 1001 和 1002 的内容并返回结果。

1.2 倒排索引的组成

倒排索引主要由:

  1. 词条:索引中最小存储和查询单元
  2. 词典:词条的集合,由文档集合中出现过的所有单词构成的字符串集合,单词词典内每条索引项记载单词本身的一些信息以及指向 “倒排列表“ 的指针
  3. 倒排列表:记载了某个单词出现过的所有文档 id 列表及单词在该文档中出现的位置信息及频率

Lucene 在对文档建立索引时,会给词典的所有元素排好序,在搜索时直接根据二分查找方法进行筛选就能够快速找到数据,时间复杂度为 O(logN)。其实这类似于 MySQL 的索引方式,直接用 B+ 树建立索引词典指向被索引的文档。

但磁盘到随机读操作仍然是非常昂贵的(一次 random access 大概需要 10ms 的时间),所以尽量减少读磁盘,就有必要把一些数据缓存到内存中,ES 希望把这个词典 “搬进” 内存,直接从内存读取数据就比磁盘读数据要快很多。问题就在于对于海量的数据,索引的空间消耗十分巨大,直接搬进来肯定不合适,所以需要进一步处理,建立词典索引(term index)。通过词典索引可以直接找到搜索词在词典中的大致位置,然后从磁盘中定位到单词在词典中的位置,进而找到倒排列表,有了倒排列表就可以根据 ID 找到文档了。所以大致的结构图就变成了这样:

ES 通过有限状态转换器(FST),把 term dictionary 变成了 term index,放进了内存,所以这个 term index 究竟是怎样?

有限状态转换器相当于是一个 Trie 前缀树,但这个树并不会包含所有的 term,而是很多 term 的前缀,可以直接根据前缀就找到对应的 term 在词典中的大致位置。

现在我们可以回答 “为什么 ES 检索比 MySQL 快了”?

MySQL 只有词典这一层,是以 B+ 树排序上方存储在磁盘上的。检索一个 term 需要若干次的随机存取的磁盘操作。而 Lucene 在词典的基础上添加了词典索引来加速检索,词典索引以前缀树的形式缓存在内存中。从词典索引查找到对应词典的 block 位置之后,再去磁盘上找 term,大大减少了磁盘的随机存取的次数。

在进行精确检索时,有时候可能 MySQL 要快一些,对于 MySQL 使用覆盖索引来进行查询,无需回表,则速度上可能更快。但是 ES 还有个优势,就是 ES 天然支持分布式和集群,使得在大量数据搜索时可以通过分片降低检索规模,并且可以通过并行检索提升效率。

1.3 倒排索引搜索过程

搜索时先去查询词典索引(Term Index),通过词典索引可以直接找到搜索单词在词典中的大致位置,然后从磁盘中定位到单词在词典中的位置,进而找到倒排列表,有了倒排列表就可以根据 ID 找到文档了。

2.分词

搜索引擎的核心是倒排索引,而倒排索引的基础就是分词。所谓分词可以简单理解为将一个完整的句子切割为一个个单词的过程。

大家还记得我们在创建索引并设置 mapping 映射信息时可以手动指定分词器吗?如果我们没有指定,ES 会使用默认标准分词器进行分词(ES 默认分词器是单字分词器),即每个字单独分一个词。

到这里,我相信对于初学者可能还是不太清楚分词器是怎么来分词的?这里我们就使用标准分词器来查看分词效果。

2.1 标准分词器

我们首先来看看标准分词器中文分词效果:

GET  http://127.0.0.1:9200/_analyze?analyzer=standard&pretty=true&text=我是程序员


再来看看标准分词器英文分词效果:

GET  http://127.0.0.1:9200/_analyze?analyzer=standard&pretty=true&text=I'm devil-zcl,good good study,day day up


为什么我们很少使用 ES 默认标准分词器呢?相信大家也从上面的结果中看出来了,标准分词器对于中文支持不太友好,默认单字分词,这样对检索精确度大打折扣。如:“我是程序员” 分词后的效果是:我、是、程、序、员,而我们需要的分词效果是:我、是、程序、程序员,这样的话就需要对中文支持良好的分词器,支持中文分词的分词器有很多,word 分词器、庖丁解牛、盘古分词、Ansj 分词等,但我们要介绍的常用的 IK 分词器。

2.2 IK 分词器

IK 中文分词器是做什么的呢?下面通过三个文档示例,看看它是如何分词?

文档 1:我爱伟大的祖国

文档 2:祝福祖国强大繁盛

文档 3:我爱蓝天白云

经过中文分词器,以上文档均会根据分词规则,将文档进行分词后的结果如下:

文档 1 分词结果:【我,爱,伟大,的,祖国】

文档 2 分词结果:【祝福,祖国,强大,繁盛】

文档 3 分词结果:【我,爱,蓝天,白云】

注意:不同的分词规则,分词结果不一样,选择分词器提供的分词规则找到适合的分词规则

通过上面的分词结果,发现拆分的每个词都是我们熟知的词语,但是如果不使用中文分词,就会发现上面的文档把每个字都拆分成了一个词,对我们中文检索不友好。

看到上面中文分词器结果,就会有新的疑问,使用中文分词器那样的分词效果有什么好处呢?

答案就是根据分词建立词汇与文档关系的倒排索引。这步都是 ES 帮我们做的,下面通过 ”我“,”爱”,“祖国” 三个词看看倒排索引,如图:

通过上图中的倒排索引,我们搜索 ”祖国“ 时,ES 通过倒排索引可以快速的检索出文档 1 和文档 2。

如果没有中文分词器,搜索 “祖国“ 就会被拆分成 ”祖“、”国“ 两个词的倒排索引,就会把包含 ”祖“ 的文档都检索出来,很明显就会和我们想要的结果大相径庭。

分词器的作用就是优化检索结果,提高检索效率。

探究 | ES倒排索引和分词相关推荐

  1. ES倒排索引与分词详解

    倒排索引 正排索引:文档id到单词的关联关系 倒排索引:单词到文档id的关联关系 示例: 对以下三个文档去除停用词后构造倒排索引 image 倒排索引-查询过程 查询包含"搜索引擎" ...

  2. ES:倒排索引、分词详解(02-28 - 03-04)

    2019独角兽企业重金招聘Python工程师标准>>> 一,倒排索引(Inverted Index) ElasticSearch引擎把文档数据写入到倒排索引(Inverted Ind ...

  3. 推荐系统[九]项目技术细节讲解z1:Elasticsearch 如何进行快速检索(ES倒排索引和分词原理)以及倒排索引在召回中的应用。

    搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排精排重排混排).系统架构.常见问题.算法项目实战总结.技术细节以及项目实战(含码源) 专栏详细介绍:搜索推荐系统专栏简介:搜索推荐全流程讲解(召回粗排 ...

  4. es倒排索引和mysql索引的_【漫画】ES原理 必知必会的倒排索引和分词

    倒排索引的初衷 倒排索引,它也是索引.索引,初衷都是为了快速检索到你要的数据. 我相信你一定知道mysql的索引,如果对某一个字段加了索引,一般来说查询该字段速度是可以有显著的提升. 每种数据库都有自 ...

  5. Elasticsearch(一)——Es安装(三个必安工具、安装各种类型分词器)、Es 十大核心概念、通过 Kibana 操作 Es(中文分词、Es各种索引命令操作)

    Elasticsearch(一)--Es安装(三个必安工具.安装各种类型分词器).Es 十大核心概念.通过 Kibana 操作 Es(中文分词.Es各种索引命令操作) 一.Elasticsearch ...

  6. 探究ES suggest search

    探究ES suggest search 问题背景 项目中存在的问题 1.项目中主要使用ES进行数据的模糊搜索以及建议搜索,但在查询数据量较大的索引时会出现偶现的慢查询. 2.在进行建议搜索时,用户如果 ...

  7. ES倒排索引及类型映射与分析器(SE倒排及搜索实现基础)

    ES倒排索引及类型映射与分析器/SE倒排及搜索实现基础 前言 1 数据类型映射 2 非结构化的全文文本查询与倒排索引(模糊的相关度的查询方式与倒排索引) 3 分析器 3.1 字符过滤器 3.2 分词器 ...

  8. Elasticsearch实战(五)-倒排索引与分词

    1 倒排索引 1.1 书的目录和索引 正排索引即目录页,根据页码去找内容 倒排索引即索引页,根据关键词去找对应页码 1.2 搜索引擎 正排索引 文档Id =>文档内容.单词的关联关系 倒排索引 ...

  9. ElasticSearch(五) 倒排索引与分词

    title: ElasticSearch(五) 倒排索引与分词 tags: ElasticSearch author: Clown95 倒排索引与分词 倒排索引 Elasticsearch 使用一种称 ...

最新文章

  1. Python编写循环的两个建议 | 鹅厂实战
  2. doe全称是什么意思_BVV线和RVV都是护套线,二者有什么区别?【辽宁津达线缆】...
  3. python 理解Matplotlib 3D (三维图) 绘图函数 plot_surface 的 rstride 和 cstride参数
  4. YOUR GUIDE TO Lowering YourCholesterol With TLC学习笔记(暂时没有完成)
  5. Codeforces Round #664 (Div. 2)
  6. seo伪原创工具_文章伪原创工具哪个好用(伪原创工具有哪些)
  7. ubuntu18.04下安装grafana6和简单使用
  8. 动态重定位的增加的紧凑功能
  9. 如何调位置_如何获得正确的驾驶坐姿?
  10. QT-提示“database not open”
  11. JavaScript面向对象之构造函数
  12. JAVA常见字符编码表
  13. 新买的联想笔记本计算机选项,联想笔记本电脑进入BIOS界面,以选择将硬盘设置为首次启动的选项...
  14. pdf里面的图片如何提取出来?
  15. 考研复试-数据库知识点速记
  16. 2020网络教育计算机统考,2020年9月网络教育统考《计算机应用基础》模拟题8
  17. 初学者应从文件目录结构理解import的过程,并创建自已的代码库
  18. 中国商标网JS调试 - 动态代码注入
  19. 关于订单支付成功后一些逻辑的处理
  20. 基于PCA的图像压缩实现

热门文章

  1. svn教程----svn服务端安装配置
  2. 乙烯利行业调研报告 - 市场现状分析与发展前景预测
  3. 微机原理课程实验(十字路口红绿灯设计)
  4. 青软实训.NET学习笔记(2)
  5. linux系统部署软件流程图,Dia:一款灵巧的流程图软件
  6. Java基础篇 - 强引用、弱引用、软引用和虚引用
  7. CAN 总线破解 汽车协议破解 - 浅谈
  8. gct哈工大c语言考试试题,哈尔滨工业大学2015年示范性软件学院软件工程硕士招生简章...
  9. Linux Ubuntu查看主要硬件配置,GPU压力测试
  10. 如何将不能下载及不能缓存的视频下载到本地电脑—解决方法