1. 程式人生 > >ElasticSearch教程——倒排索引

ElasticSearch教程——倒排索引

倒排索引

Elasticsearch 使用一種稱為 倒排索引 的結構,它適用於快速的全文搜尋。一個倒排索引由文件中所有不重複詞的列表構成,對於其中每個詞,有一個包含它的文件列表。

例如,假設我們有兩個文件,每個文件的 content 域包含如下內容:

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

為了建立倒排索引,我們首先將每個文件的 content 域拆分成單獨的 詞(我們稱它為 詞條 或 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

兩個文件都匹配,但是第一個文件比第二個匹配度更高。如果我們使用僅計算匹配詞條數量的簡單 相似性演算法 ,那麼,我們可以說,對於我們查詢的相關性來講,第一個文件比第二個文件更佳。

但是,我們目前的倒排索引有一些問題:

  • Quick 和 quick
     以獨立的詞條出現,然而使用者可能認為它們是相同的詞。
  • fox 和 foxes 非常相似, 就像 dog 和 dogs ;他們有相同的詞根。
  • jumped 和 leap, 儘管沒有相同的詞根,但他們的意思很相近。他們是同義詞。

使用前面的索引搜尋 +Quick +fox 不會得到任何匹配文件。(記住,+ 字首表明這個詞必須存在。)只有同時出現 Quick 和 fox 的文件才滿足這個查詢條件,但是第一個文件包含 quick fox ,第二個文件包含 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 了。但是,如果我們對搜尋的字串使用與 content 域相同的標準化規則,會變成查詢 +quick +fox ,這樣兩個文件都會匹配!