前言
昨天面试时被问到了ES的物理存储逻辑, 虽然知道基本结构为倒排表的物理结构,但是更详细的就不清楚,今天网上找了资料详细了解下, 引用自知乎大佬(https://zhuanlan.zhihu.com/p/413984787)
es基本结构
基本结构是倒排表:
通过将将文章分词,然后以分词结果作为查询索引,可以快速通过短语查询获得文档
比如文档A: “我爱中国” ,分词后为[我, 爱, 中国]
则es的倒排索引就变成了
[
“我” ->A
“爱” ->A
“中国” ->A
]
其中 分词后的结果又被称为term
如何快速查找term值呢
一开始没有思考这个问题, 当被问到这个问题是, 第一反应是Hash方法, 毕竟最快,可以做到O(1)的复杂度,但是仔细思考下就发现, 如果通过Hash值的话可能需要大量加载数据进入内存,这显然是不合理的
后来找到了答案,通过一种字典树的方式:
引用大佬原话:
这棵树不会包含所有的 term,它包含的是 term 的一些前缀(这也是字典树的使用场景,公共前缀)。通过 term index 可以快速地定位到 term dictionary 的某个 offset,然后从这个位置再往后顺序查找