• Elasticsearch 入门到精通-ElasticSearch技术原理之倒排索引的数据结构


    1、Elasticsearch倒排索引的精髓

    倒排索引压缩储存空间,减少磁盘读取次数;严格储存结构,节省搜索时间。

     简单的来说,Elasticsearch将磁盘里的东西尽量搬进内存,减少磁盘随机读取次数(同时也利用磁盘顺序读特性),结合各种奇技淫巧的压缩算法,用极其苛刻的态度使用内存。

    倒排索引(Inverted Index)也叫反向索引,有反向索引必有正向索引。通俗地来讲,正向索引是通过key找value,反向索引则是通过value找key。

    Elasticsearch能够通过倒排索引来达到实时、高效的搜索是怎么实现的呢?下面我从时间和空间的概念来谈谈倒排索引的原理。

    先来回忆一下我们是怎么插入几条索引记录的:

    1. POST _bulk
    2. {
    3. "index": {
    4. "_index": "school",
    5. "_id": "1"
    6. }
    7. }
    8. {
    9. "stuName": "Rose",
    10. "age": 24,
    11. "gender": "Male"
    12. }
    13. {
    14. "index": {
    15. "_index": "school",
    16. "_id": "2"
    17. }
    18. }
    19. {
    20. "stuName": "John",
    21. "age": 24,
    22. "gender": "Female"
    23. }
    24. {
    25. "index": {
    26. "_index": "school",
    27. "_id": "3"
    28. }
    29. }
    30. {
    31. "stuName": "Bill",
    32. "age": 29,
    33. "gender": "Female"
    34. }

    其实就是直接PUT一个JSON的对象,这个对象有多个字段,在插入这些数据到索引的同时,Elasticsearch还为这些字段建立索引——倒排索引,因为Elasticsearch最核心功能是搜索。 

    创建了如下三条数据

    IDstuNameagegender
    1Rose24Male
    2John24Female
    3Bill29Female

     每个字段对于的倒排索引的信息

    stuName

    TermPosting List
    Rose1
    John2
    Bill3

    age

    TermPosting List
    24[1,2]
    29[3]

    gender

    TermPosting List
    Female1
    Male[2,3]

    那么,倒排索引是个什么样子呢?

    在这里插入图片描述

    Posting List
    Posting List是Elasticsearch中为每个字段field自动提供的索引集合,比方说24,29 这些叫做 term,而 [1,2] 就是 posting list。Posting list 就是一个 int 的数组,存储了所有符合某个 term 的文档 id。

    Term Dictionary
    Elasticsearch中为了能够快速的找到某个term,也就是我们经常用某个字段来快速查询,为了实现这一功能,Term Dictionary就产生了。Term Dictionary的实现底层就是B+Tree,使用二分法进行查询term, logN 次磁盘查找效率,就像字典查询一样,首字母是什么,就先检索什么,然后再看第二个字母是什么,检索第二个字母,…,一直到检索到这个term为止。

    Term Index
    由于磁盘随机读的存在,就必须将一部分数据存在缓存内存中,但是Term Dictionary磁盘存储空间的巨大,又不能将Term Dictionary完整的放到内存里。因此就有了Term Index,它就像字典里一个更大的章节一样,每个大的章节再对应着多个小的章节Term Dictionary,这样就能实现速的找到某个term。

    Term IndexTerm DictionaryPosting List个关系
    如下图 所示:“A”, “to”, “tea”, “ted”, “ten”, “i”, “in”, 和 “inn” 这些单词是如何储存在Elasticsearch里的呢?Term Index就像一棵倒挂的树一样,它就是这棵树的根节点,也就是这本字典;Term Dicitionary是根节点的子节点,存放着“t”、“A”、“i”,也就是所储存单词的前缀;然后Posting List就是相同前缀的单词(term)集合,里面装着我们要检索的单词(term)。因此通过 term index能够快速精确的检索到我们所需要的term

    在这里插入图片描述​​​​​​​

     

  • 相关阅读:
    成人职业教育:知乎、B站、网易“短兵相接”
    c#-特殊的集合
    idea 一直卡在maven正在解析maven依赖
    MySQL 索引类型和存储引擎详解
    1、【开始】【简介】Qlib:量化平台
    华为od 面试题及流程 (前后端)
    FITC荧光标记果聚糖Fructan/阿拉伯聚糖Fructan/脂多糖LPS定制合成
    Abnova酸性磷酸酶(小麦胚芽)说明书
    瘦”AP与“胖”AP的区别
    网页脚本语言第一节课9.19
  • 原文地址:https://blog.csdn.net/wangguoqing_it/article/details/125362267