多渠道简单理解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

