Inverted Index - 倒排索引

Inverted Index是一种数据结构,它专门用来服务快速搜索的。它首先是一个文本中出现的独立的单词列表,然后每个单词对应一个list,这个list中包含了所有有这个单词的文本。我们来看下面这个例子,假设我们有下面两个文本内容:

1. The quick brown fox jumped over the lazy dog
2. Quick brown foxes leap over lazy dogs in summer

我们创建Inverted index的时候,会首先把这些内容分成单独的单词(又称之为terms或者tokens),然后创建一个单词的list,并且每个单词在对应一个文本list,结果如下所示:

img

这个时候我们搜索“quick brown”的时候,就只要去看这两个单词的结果了(类似一个值为列表的hash查询):

img

我们可以看到两个文本中都有我们想要查询的单词,而且Doc1中两个单词都出现了,Doc2中只出现了一个单词,所以假如我们使用一个很简单的算法来判断相似度,比如就比较谁出现的数目多的话,那我们可能会认为Doc1的匹配度更好一点,毕竟两个单词在它里面都出现了。


但是当我们仔细回想之后会发现,这样简单的比较好像有点问题:

  1. 我们上面把Quick和quick认为是两个term,而假如我们人来看的话,可能会认为他们其实是一样的。
  2. fox和foxes以及dog和dogs其实也是很类似的,只是单复数的差别而已。
  3. jumped和leap虽然是不同的单词,但他们是同义词。

比如说假如我们这时候搜索+Quick +fox就会遇到上面的问题(这里的+意味着这个单词必须存在),这个时候就没有结果,因为上面两个文本都没有这两个单词同时出现的情况。而从我们人的分析来看,我们希望的可能是上面两个文本都匹配到我们的查询。如何解决这个问题呢?我们可以normalize这些term到标准的格式,比如说:

  • Quick可以全部变成小写的quick
  • Foxes可以变成它的根单词fox,同样的dogs也可以变成dog
  • jumped和leap是同义词,就可以都变成jump。

这样处理之后我们的index就变成了下面这个样子:

img

这里的tokenizationnormalization就是我们上一节介绍的analysis过程。


参考: https://donggeitnote.com/2021/08/29/elasticsearch-analysis/