答: 因为ES的倒排索引还做了 Term Index。
什么是Term Index?
答: 将分词后的term进行排序索引,类似的mysql对于"term"(即主键,或者索引键)只是做了排序, 并且是大部分是放在磁盘上的,只有B+树的上层才是放在内存中的,查询仍然需要logN的访问磁盘,而ES将term分词排序后还做了一次索引,term index,即将term的通用前缀取出,构建成Trie树
trie树 :https://zh.wikipedia.org/wiki/Trie
这个树的缺点:存在大量字符串且这些字符串基本没有公共前缀,则相应的trie树将非常消耗内存
通过这个树可以快速的定位到Term dictionary的本term的offset,再经过顺序查找,便可以很快找到本term的posting list。
什么是FST?
答: Finite State Transducer
FST有两个优点:1)空间占用小。通过对词典中单词前缀和后缀的重复利用,压缩了存储空间;2)查询速度快。O(len(str))的查询时间复杂度。
Term Dictionary为什么节约空间?
Term dictionary 在磁盘上是以分 block 的方式保存的,一个 block 内部利用公共前缀压缩,比如都是 Ab 开头的单词就可以把 Ab 省去。这样 term dictionary 可以比 b-tree 更节约磁盘空间。
上个问题中的block和ES集成测试类ESIntegTestCase中的disableIndexBlock(String index, String block) 有关吗?
/** Disables an index block for the specified index */
public static void disableIndexBlock(String index, String block) {
Settings settings = Settings.builder().put(block, false).build();
client().admin().indices().prepareUpdateSettings(index).setSettings(settings).get();
}
答 : 不知道
skip list 的原理是什么?
答 : 跳跃表
网友评论