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,结果如下所示:
这个时候我们搜索“quick brown
”的时候,就只要去看这两个单词的结果了(类似一个值为列表的hash查询):
我们可以看到两个文本中都有我们想要查询的单词,而且Doc1中两个单词都出现了,Doc2中只出现了一个单词,所以假如我们使用一个很简单的算法来判断相似度,比如就比较谁出现的数目多的话,那我们可能会认为Doc1的匹配度更好一点,毕竟两个单词在它里面都出现了。
但是当我们仔细回想之后会发现,这样简单的比较好像有点问题:
比如说假如我们这时候搜索+Quick +fox就会遇到上面的问题(这里的+意味着这个单词必须存在),这个时候就没有结果,因为上面两个文本都没有这两个单词同时出现的情况。而从我们人的分析来看,我们希望的可能是上面两个文本都匹配到我们的查询。如何解决这个问题呢?我们可以normalize这些term到标准的格式,比如说:
这样处理之后我们的index就变成了下面这个样子:
这里的tokenization和normalization就是我们上一节介绍的analysis过程。
参考: https://donggeitnote.com/2021/08/29/elasticsearch-analysis/