CS-Notes 学习笔记
面试常问Java 后端 · MySQL

Elasticsearch 为什么搜索快?倒排索引是什么?

先自己想一想,再看参考要点

参考要点

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

学习站:先用面试题自评定级,按水平和面试日期排出每天的计划,自评过的题按间隔复习。免费、无需注册,记录只保存在自己的浏览器中。