Elasticsearch倒排索引(二)深入Term Index

  • 1. 理解Term Index
  • 2. 减小Term Index存储空间 —— FST

1. 理解Term Index

  1. 在《Elasticsearch倒排索引(一)简介》中我们讲到,需要一种高效的数据结构对映射关系中的词语集合也就是Term Dictionary进行索引,这种结构叫作Term Index。那么,Term Index是以怎样的形式进行组织的呢?

  2. 最简单的理解,Term Index 就像一本词典的目录一样:

    A ……………. xx 页
    C ……………. xx 页
    E ……………. xx 页

    但是实际上Term可以是任意的 byte 数组,而不仅仅是英文字符,因此实际的 Term Index 是一棵 Trie Tree:
    如图所示是一棵 Trie Tree。这棵 Trie Tree 不会包含所有的 term,它包含的是 term 的一些前缀。通过 Term Index 可以快速地定位到 Term Dictionary 的某个 offset,然后从这个位置再往后顺序查找。再加上一些压缩技术 e.g. FST,Term Index 需要的存储空间非常小,可能只有所有 term 占用空间的几十分之一,因此 Term Index 被完全缓存在内存中是没有问题的。

  3. 使用了 Term Index 后,ES的倒排索引整体效果如下:

    现在我们可以很清楚地知道为什么ES的检索要比MySQL快得多了。在MySQL中,即使建立了索引,但索引是以B+ Tree的形式存储在磁盘上的,在数据量比较大的情况下,想要检索到一条记录,需要若干次的random access的磁盘操作。而ES在Term Dictionary(相当于MySQL中的索引)的基础上,又添加了Term Index这一结构,并且直接以Trie Tree的形式缓存在内存中。在检索一个term时,只需要从Term Index查找到对应的Term Dictionary的block的位置,再到磁盘上去访问对应的数据,大大减少了对磁盘的random access操作的次数。

2. 减小Term Index存储空间 —— FST

  1. 在前一小节我们说到,Term Index要被直接缓存在内存中以提升查找速度,那么就必然要采用某种结构来压缩Term Index。Term Index在内存中就是以FST(Finite State Transducers,有限状态转换机)的形式来存储的。

  2. 说到FST,就不得不提FSM(Finite State Machines,有限状态机):表示有限个状态集合以及这些状态之间转移和动作的数学模型。其中一个状态被标记为开始状态,0个或多个状态被标记为final状态。一个FSM同一时间只处于一个状态。
    在图中,椭圆形中代表的是状态,而箭头则代表了转移。图中这个FSM代表了对人的一天之内活动的一个抽象,但是未标注开始状态与结束状态。人在同一时间只能处于一种状态,并且从一个状态转移到下一个状态需要一个输入。如果在这个FSM中,人的初始状态为“睡觉”,然后接收的输入依次为:睡醒了、吃饱了、累了、有新电影上映、困了,那么这个人的状态就会依次变化:睡觉 → 吃饭 → 工作 → 逛街 → 睡觉。

  3. FST是一种类Trie Tree,使用FSM作为数据结构,可以理解为key -> value形式。

  4. FST具有两大优点:

    • 空间占用小:通过对前缀和后缀的重复利用,压缩了存储空间;
    • 查询速度快:时间复杂度为O(len(str));
  5. FST的构造过程如下:
    我们假设创建以下一组映射:

    Key → Value
    “cat” → 5
    “deep” → 10
    “do” → 15
    “dog” → 2
    “dogs” → 8

    由于在处理大数据的情况下,不太可能把整个FST都同时放在内存中,而是要边建立FST边将建好的部分存储在外部文件中以便节省内存,所以经典FST算法要求key必须按字典序从小到大加入到FST中。所以首先要对所有key按照字典序进行排序(本例已按照字典序排列)。

    根据此例的输入,可以建立下图所示的FST:
    从上图可以看出,每条边有两个属性,Label(key)和Out(value)。注意Out不一定是数字,也有可能是字符串,但要求必须满足叠加性,比如:

    2 + 8 = 10;
    a + bc = abc;

    建立FST之后,就可以很轻松地根据一个key找到对应的value了。例如:查找dog,我们查找的路径为:0 → 4 → 8 → 9。 其权值和为: 2 + 0 + 0 + 0 = 2。其中最后一个零表示 node[9].finalOut = 0。所以“dog”对应的value为2。

Elasticsearch倒排索引(二)深入Term Index相关推荐

  1. 3、Elasticsearch-Term Dictionary和Term Index

    Term Dictionary-Term词典 单词词典是倒排索引中非常重要的组成部分,它用来维护文档集合中出现过的所有单词的相关信息,同时用来记载某个单词对应的倒排列表在倒排文件中的位置信息.在支持搜 ...

  2. 倒排索引的数据结构:Term index、Term Dictionary、Posting List

    2.倒排索引的数据结构 倒排索引其实包含了三种数据,分别是 倒排表(Posting List) 词项字典(Term Dictionary) 词项索引(Term Index) 这几种文件分别存储了不同的 ...

  3. ElasticSearch——倒排索引和正向索引

    ElasticSearch--倒排索引和正向索引 1.正向索引 正向索引 (forward index) 以文档的ID为关键字,表中记录文档中每个字的位置信息,查找时扫描表中每个文档中字的信息直到找出 ...

  4. elasticsearch拼写纠错之Term Suggester

    一.什么是拼写纠错 拼写纠错就是搜索引擎可以智能的感知用户输入关键字的错误,并使用纠正过的关键字进行搜索展示给用户:拼写纠错是一种改善用户体验的功能: elasticsearch提供了以下不同类型的s ...

  5. elasticsearch定时删除过期索引index

    elasticsearch定时清理过期索引index 一.定时函数 二.获取过期时间 三.获取esClient 四.获取全部索引 五.判定索引是否过期 六.删除过期索引 七.demo代码 一.定时函数 ...

  6. Elasticsearch 学习(二).实战使用

    Elasticsearch 学习(二).实战使用 参考:http://www.passjava.cn/#/01.PassJava/02.PassJava_Architecture/15.Elastic ...

  7. Elasticsearch高级二

    Elasticsearch高级二 Elasticsearch查询详解 查询Query 代码 public class EsDemo2 {static String index = "test ...

  8. Python 数据分析三剑客之 Pandas(二):Index 索引对象以及各种索引操作

    CSDN 课程推荐:<迈向数据科学家:带你玩转Python数据分析>,讲师齐伟,苏州研途教育科技有限公司CTO,苏州大学应用统计专业硕士生指导委员会委员:已出版<跟老齐学Python ...

  9. Elasticsearch(二):理解index, Document, Field

    1. 概念 1.1 Document 定义: 可以被搜索数据的最小单位. 特性:文档会被序列化成Json格式,每个文档都有一个Uid,每个文档的id是独一无二的. Metadata元数据:标注文档的相 ...

最新文章

  1. 怎么在PHP植入音乐,PHP网站插入音乐
  2. 科普丨人工智能发展的S曲线
  3. KeelKit 中集成了代码统计功能
  4. 【python+beautifulsoup4】Python中安装bs4后,pycharm报错ModuleNotFoundError: No module named 'bs4'...
  5. 认识J2EE规范或标准以及J2EE和JEE有什么不同?
  6. 去小公司了解哪些工具?
  7. centos 7上ambari安装试用
  8. python递归查找_Python程序使用递归查找数字的幂
  9. 视觉SLAM笔记(42) 光流法跟踪特征点
  10. 三端稳压7805和7905稳压原理及典型电路
  11. 浅谈设备驱动的作用与本质,有无操作系统Linux设备驱动的区别
  12. 看完这篇 Session、Cookie、Token,和面试官扯皮就没问题了
  13. fw313r手机登录_2017最新迅捷(FAST)fw313r路由器手机设置教程
  14. STC51单片机-实验开发装置仿真-物联网应用系统设计
  15. log4j2配置日志默认最大个数,以及自动删除过期日志文件的配置
  16. 杨辉三角(C语言简单版)
  17. H3C路由器配置忘记密码恢复
  18. 虚拟机(VM)与JVM
  19. 动网8.1后台拿站技巧
  20. verilog写的一个简洁实用的PWM模块

热门文章

  1. 在暗影精灵游戏本上安装 Centos7
  2. 我的世界lifeboat服务器怎么注册,精选服务器/Lifeboat Network
  3. 给n个学生分配n个座位,要求学号相邻的学生座位不相邻!
  4. 模拟银行取款,存款,转账,余额查询等功能7-19
  5. 智云物业v5.0.7
  6. 基于MATLAB的入门数学运算(附代码)
  7. 如何在html中快速的做出锚点图效果
  8. c语言中的creat()函数使用及参数详解
  9. 易语言大漠多线程模板多线程全部暂停恢复
  10. 英雄体育冲刺港交所上市背后:深陷“增收不增利”,极其依赖腾讯