Elasticsearch-倒排索引

Elasticsearch 使用一种称为 倒排索引 的结构,它适用于快速的全文搜索。
一个倒排索引由文档中全部不重复词的列表构成,对于其中每一个词,有一个包含它的文档列表。算法

假设咱们有两个文档,每一个文档的 content 域包含以下内容:ui

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

为了建立倒排索引,咱们首先将每一个文档的 content 域拆分红单独的 词(咱们称它为 词条 或 tokens ),建立一个包含全部不重复词条的排序列表,而后列出每一个词条出如今哪一个文档。结果以下所示:code

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

两个文档都匹配,可是第一个文档比第二个匹配度更高。若是咱们使用仅计算匹配词条数量的简单 类似性算法 ,那么,咱们能够说,对于咱们查询的相关性来说,第一个文档比第二个文档更佳。索引

可是,咱们目前的倒排索引有一些问题:token

  • Quick 和 quick 以独立的词条出现,然而用户可能认为它们是相同的词。
  • fox 和 foxes 很是类似, 就像 dog 和 dogs ;他们有相同的词根。
  • jumped 和 leap, 尽管没有相同的词根,但他们的意思很相近。他们是同义词。

使用前面的索引搜索 +Quick +fox 不会获得任何匹配文档。(记住,+ 前缀代表这个词必须存在。)只有同时出现 Quick 和 fox 的文档才知足这个查询条件,可是第一个文档包含 quick fox ,第二个文档包含 Quick foxes 。文档

咱们的用户能够合理的指望两个文档与查询匹配。咱们能够作的更好。ast

若是咱们将词条规范为标准模式,那么咱们能够找到与用户搜索的词条不彻底一致,但具备足够相关性的文档。例如:搜索

  • 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
------------------------
相关文章
相关标签/搜索