都知道lucene使用倒排索引来搜索文档,哪倒排索引究竟是个什么呢?
倒排索引是区分于正排索引的概念
正排索引:以文档的唯一id作为索引,以文档的内容作为记录的结构
倒排索引:以文档中内容的单词作为的索引,以文档的id作为内容的结构
相比关系数据库使用的“like %XX%”查询,倒排索引有什么优点
- 搜索效率更高,like“%xx%”,无法使用索引,会走全表扫描,效率差
- 可以实现更复杂的搜索场景,like“%xx%”只能实现首尾的模糊查询
倒排索引的实现
倒排索引由两部分组成,一个是Term Dictionary(字典表),一个是Postings List(记录表)。它们两的关系类似Map中的key-value, 字典表中是key,记录表中是value。
Term Dictionary(字典表):记录的是分词后的term
Postings List(记录表):
- 文档 id(DocId, Document Id),包含单词的所有文档唯一 id,用于去正排索引中查询原始数据。
- 词频(TF,Term Frequency),记录 Term 在每篇文档中出现的次数,用于后续相关性算分。
- 位置(Position),记录 Term 在每篇文档中的分词位置(多个),用于做词语搜索(Phrase Query)。
- 偏移(Offset),记录 Term 在每篇文档的开始和结束位置,用于高亮显示等。