es:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/inverted-index.html
下一页:http://my.oschina.net/qiangzigege/blog/265553
内容:
es使用称为倒排索引的结构达到快速全文搜索的目的。
一个倒排索引包含一系列不同的单词,这些单词出现在任何一个文档,
对于每个单词,对应着所有它出现的文档。
比如说,我们有2个文档,每个文档有一个conteng字段。
内容如下:
“ The quick brown fox jumped over the lazy dog”
“ Quick brown foxes leap over lazy dogs in summer”
为了创建倒排索引,
我们首先对每个字段进行分词,我们称之为terms或者tokens,创建了一些列有序列表,
然后列举了每个单词所出现的文档,结果如下:
Term Doc_1 Doc_2
-------------------------
Quick | | X
The | X |
brown | X | X
dog | X |
dogs | | X
fox | X |
foxes | | X
in | | X
jumped | X |
lazy | X | X
leap | | X
over | X | X
quick | X |
summer | | X
the | X |
------------------------
现在,如果我们想搜索"quick brown",我们只需要找到每个单词出现的文档。
Term Doc_1 Doc_2
-------------------------
brown | X | X
quick | X |
------------------------
Total | 2 | 1
两个文档都匹配,但是第一个文档有更高的匹配度,
如果我们采用一个简单的相似算法,我们可以说,第一个文档比第2个文档有更高的匹配度。
也更相关。
但是,仍然有一些问题。
"Quick"和"quick"看起来是不同的单词,但是用户通常认为是一样的。
"fox"和"foxes"更相似,还有"dog"和"dogs",具有共同的词根。
"jumped"和"leap",尽管不具备相同的词根,意思上是一样的。它们是同义词。
对于以上的索引,一个搜索"+Quick + fox"不可能匹配任何文档。
单词"Quick" 和单词 "fox"必须在同一个文档里以满足查询要求,
但是第一个文档包括"quick fox" 而第2个文档包含 "Quick foxes".
我们的用户有理由希望两个文档都匹配,我们可以做的更好。
如果我们把单词归一化到标准格式,我们就可以达到上面的目标。
这种情况下,虽然单词不是完全一致,但是也足够相似保证相关性。比如:
"Quick" 可以小写为 "quick".
"foxes" 可以提取词根成为 "fox".
类似的 "dogs" 可以成为 "dog".
"jumped" 和 "leap" 是同义词,可以索引为一个单词 "jump".
那么,现在的索引就是:
Term Doc_1 Doc_2
-------------------------
brown | X | X
dog | X | X
fox | X | X
in | | X
jump | X | X
lazy | X | X
over | X | X
quick | X | X
summer | | X
the | X | X
------------------------
我们的搜索 "+Quick +fox" 仍然失败,因为我们不再有Quick在索引里,
尽管如此,如果我们采用同样的归一化规则,
我们可以用在查询字符串上,它就变为 "+quick +fox",
这样就可以匹配到文档。
这一点非常重要,你只能找到那些在你的索引里出现的单词,所以,索引过的文本和查询字符串都需要遵循同一种归一化规则。
分词和归一化叫做分析,下一节讨论。