多渠道简单理解elasticsearch的索引原理:
    正排索引

    ID 内容
    1 elasticsearch是最火爆的分布式搜索引擎
    2 java是世界上最好的语言
    3 搜索引擎是如何诞生的

    倒排索引:将字段内容进行分词后以一下形式进行索引存储

    索引词元 文档ids
    elasticsearch 1
    火爆 1
    分布式 1
    搜索引擎 1,3
    java 2
    世界 2
    最好 2
    语言 2
    如何 3
    诞生 3

    倒排列表:以”搜索引擎”为例

    文档ID TF(词频) position(位置) offset(偏移量)
    1 1 3 <21,25>
    3 1 0 <0,4>

    Elasticsearch分别为每个field都建立了一个倒排索引,elasticsearch, 火爆, 分布式, 搜索引擎这些叫term,当有成千上万的term的时候,es是如何快速找到对应的索引呢?
    Elasticsearch为了能快速找到某个term,将所有的term排个序,二分法查找term,logN的查找效率,就像通过字典查找一样,这就是Term Dictionary。
    B-Tree通过减少磁盘寻道次数来提高查询性能,Elasticsearch也是采用同样的思路,直接通过内存查找term,不读磁盘,但是如果term太多,term dictionary也会很大,放内存不现实,于是有了Term Index,就像字典里的索引页一样,A开头的有哪些term,分别在哪页,可以理解term index是一颗树。
    这棵树不会包含所有的term,它包含的是term的一些前缀。通过term index可以快速地定位到term dictionary的某个offset,然后从这个位置再往后顺序查找。
    所以term index不需要存下所有的term,而仅仅是他们的一些前缀与Term Dictionary的block之间的映射关系,再结合FST(Finite State Transducers)的压缩技术,可以使term index缓存到内存中。从term index查到对应的term dictionary的block位置之后,再去磁盘上找term,大大减少了磁盘随机读的次数。
    利用倒排索引,进行搜索的话,假设现在有100万条数据,拆分出来的词语,假设有1000万个,那么在倒排索引中,就有1000万行,我们并不需要搜索1000万次,直接在Term index中快速定位即可,这样我们就可以找到这个搜索词对应的数据。
    参考:
    https://blog.csdn.net/sdksdk0/article/details/78469190
    https://www.cnblogs.com/dreamroute/p/8484457.html


    cd85c304-2625-42c5-a589-355b54bcd85e.jpg