天天看點

ElasticSearch(ES)反向索引原理

轉載自:https://www.jianshu.com/p/323547de1bb2

ElasticSearch(ES)反向索引原理

  • Elasticsearch(ES)使用稱為反向索引的結構達到快速全文搜尋的目的
  • 一個反向索引由文檔中所有不重複詞的清單構成
  • 對于其中每個詞,有一個包含它的文檔清單
  • 反向索引建立的是分詞(Term)和文檔(Document)之間的映射關系,在反向索引中,資料是面向詞(Term)而不是面向文檔的
ElasticSearch(ES)反向索引原理

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

文檔一:The quick brown fox jumped over the lazy dog

文檔二:Quick brown foxes leap over lazy dogs in summer

為了建立反向索引,我們首先将每個文檔的content域拆分成單獨的 詞(我們稱它為詞條或tokens),建立一個包含所有不重複詞條的排序清單,然後列出每個詞條出現在哪個文檔。結果如下所示:

Term Doc_1 Doc_1
Quick X
The X
brown X 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_1
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_1
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,這樣兩個文檔都會比對!

繼續閱讀