Elasticsearch 为什么搜索快?倒排索引是什么?
先自己想一想,再看参考要点
参考要点
- 正排索引从文档找内容,倒排索引从词找文档:写入时把每个文档分词,词典按字节序记录所有词,每个词对应一个倒排表,按递增的文档编号记录包含它的文档、词频和位置
- 搜“降噪耳机”时先分成“降噪”和“耳机”,取出两个倒排表求交集,再按 BM25 算相关度排序,代价取决于倒排表的长度而不是文档总数
- B+Tree 索引的是整个字段值,LIKE '%蓝牙耳机%' 前面有 % 时只能全表扫描,倒排索引的是字段中的每个词,词在哪个位置都能直接找到
- 词典分块存放,内存中的词索引先定位到块,倒排表差值编码后按 128 个一组打包,组间有跳转信息,求交集时由最短的表领头整组跳过
- 段写完不再修改,可以放心缓存、读时不加锁
- 代价是写入要分词建索引,更新相当于删除再写入,排序和聚合要靠 doc_values