1. 何为倒排索引
索引,初衷都是为了快速检索到你要的数据。每种数据库都有自己要解决的问题(或者说擅长的领域),对应的就有自己的数据结构,而不同的使用场景和数据结构,需要用不同的索引,才能起到最大化加快查询的目的。对 Mysql 来说,是 B+ 树,对 Elasticsearch/Lucene 来说,是倒排索引。
ES是一个分布式的搜索与分析引擎,既然用MySQL也可以实现搜索的功能,那为什么还需要搜索引擎呢?
A relational database can store data and also index it. A search engine can index data but also store it.
在没有搜索引擎时,我们是直接输入一个网址,然后获取网站内容,这时我们的行为是:document -> word。通过文章,获取里面的单词,即正向索引 - forward index。后来我们希望能够输入一个单词,找到包含这个单词或者和这个单词相关的文章,即word -> documents,称这种索引为inverted index,国内翻译为倒排索引。
倒排索引用来存储在全文检索下某个单词在一个文档或者一组文档中的存储位置的映射,它是文档检索系统中最常用的数据结构。
2. 如何构建倒排索引
- 分词后,生成词条序列

- 按词项排序

- 词典&倒排记录表
- 某个词项在单篇文档中的多次出现会被合并
- 拆分成词典和倒排记录表两部分
- 每个词项出现的文档数目(Doc Frequency,DF)会被加入

Lucene的倒排索引,增加了最左边的一层字典树 - Term Index,它不存储所有的单词,只存储单词前缀,通过字典树找到单词所在的块,也就是单词的大概位置,再在块里二分查找,找到对应的词,再找到单词对应的文档列表。

原生的Posting List有两个
6万+

被折叠的 条评论
为什么被折叠?



