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
------------------------
相關文章
相關標籤/搜索