天天看點

[ElasticSearch]反向索引

Elasticsearch使用一種叫做反向索引(inverted index)的結構來做快速的全文搜尋。反向索引由在文檔中出現的唯一的單詞清單,以及對于每個單詞在文檔中的位置組成( An

inverted index consists of a list of all the unique words that appear in any document, and for each word, a list of the documents in which it appears)。

例如,我們有兩個文檔,每個文檔都有一個content字段,内容如下:

  1. The quick brown fox jumped over the lazy dog

  2. Quick brown foxes leap over lazy dogs in summer

為了建立反向索引,我們首先切分每個文檔的content字段為單獨的單詞(我們把它們叫做詞項(terms)或者詞條(tokens)),把所有的唯一詞項terms放入清單中并排序,并列出每個詞項出現在哪些文檔中,結果是這個樣子的:

現在,如果我們想搜尋"quick brown",我們隻需要找到每個詞在哪個文檔中出現即可:

兩個文檔都比對,但是第一個比第二個有更多的比對項。 如果我們使用一個簡單的相似度算法(similarity algorithm),隻是計算比對單詞的數目,這樣我們就可以說第一個文檔比第二個比對度更高——對于我們的查詢具有更多相關性。

但是在我們的反向索引中還有些問題:

(1)"Quick"和"quick"被認為是不同的單詞,但是使用者可能認為它們是相同的。

(2)"fox"和"foxes"很相似,就像"dog"和"dogs",它們都是同根詞。

(3)"jumped"和"leap"不是同根詞,但意思相似,它們是同義詞。

上面的索引中,搜尋"+Quick +fox"不會比對任何文檔(字首+表示單詞必須比對到)。"Quick"和"fox"都在同一文檔中才可以比對查詢,但是第一個文檔中隻包含fox",不包含"Quick"(雖然包含"quick"),而第二個文檔中隻包含"Quick",不包含"fox"(雖然包含" foxes")。使用者可以合理地希望兩個文檔都能比對查詢,我們也可以做得更好。

如果我們将詞為統一為标準格式,這樣就可以找到不是确切比對查詢,但是足以相似進而可以關聯的文檔。例如:

(1)"Quick"可以轉為小寫成為"quick"。

(2)"foxes"可以被轉為根形式"fox"。同理"dogs"可以被轉為"dog"。

(3)"jumped"和"leap"同義就可以隻索引為單個詞"jump"



現在索引:

但我們還未成功。我們的搜尋"+Quick +fox"依舊失敗,因為"Quick"的确切值已經不在索引裡,不過,如果我們使用相同的标準化規則處理查詢字元串的content字段,查詢将變成"+quick +fox",這樣就可以比對到兩個文檔。

這個标準化的過程叫做分詞(analysis)。

參考:

https://www.elastic.co/guide/en/elasticsearch/guide/current/inverted-index.html

繼續閱讀