inverted index,也称反向索引,通常称之为倒排索引。用来存储在全文检索下某个Term在文档中存储的映射,这种数据结构在文档搜索中经常用到。
有两种不同的反向索引方式
1 一条记录的水平反向索引,包含每个引用单词的文档列表。
2 一个单词的水平反向索引,又包含每个单词在一个文档中的位置。计算比较复杂。
与反向索引相对的是正向索引。
正向索引结构如下
文档1:关键词1,关键词2,关键词3,...
文档2:关键词1,关键词222,关键词444,...
......
正向索引结构下,如果用户搜索语句为:xxx关键词1,那么就需要对全文进行检索,找到含有关键词1的所有文档,然后根据打分模型打分,排好序后返回给用户。当文档数目很多的时候,这种索引结构无法满足实时搜索。
因此,提出了反向索引的概念。
反向索引结构如下
关键词1:文档1,文档2,文档3,...
关键词2:文档1,文档22,文档33,...
这样,当用户搜索:xxx关键词1,可以找到关键词1对应的所有文档,然后根据打分模型打分后返回给用户。这样的效率提高很多。
总结
一个倒排索引,是由文档中所有不重复词的列表组成,每个词对应一个包含该词的所有文档列表。但是,倒排索引存储了比包含一个term的文档列表多地多的信息,它可能包含每一个term的文档数量,一个term出现在指定文档中的频次,每个文档中term的顺序,每个文档的长度,所有文档的平均长度等等。这些统计信息使Elasticsearch知道哪些term更重要,哪些文档更重要,也就是相关性。
在全文搜索的早些时候,会为整个文档集合建立一个大索引,并且写入磁盘。只要新索引准备好了它就会替代旧的索引,最近的修改可以被检索。
倒排索引目前有一些问题
1 Quick 和 quick以独立的关键词出现,但是用户认为它们是相同的。
2 fox和foxes非常相似,就像dog和dogs,它们有相同的词根。
3 jumped和leap,尽管它们没有相同的词根,但是意思相近。
我们需要将词条规范为标准模式,这样,我们可以搜索到一些同用户搜索词不完全一致,但是有一定相关性的文档。
另外,如果我们只是将文档的content进行了规范化,而用户搜索词没有标准化时,仍然无法搜索到结果,因此,也需要对用户搜索词做相同的规范化处理。