elasticsearch 使用一種叫做 倒排索引(inverted index)的結構來做快速的全文搜尋。倒排索引由在文件**現的唯一的單詞列表,以及對於每個單詞在文件中的位置組成。
例如,我們有兩個文件,每個文件content
字段包含:
the quick brown fox jumped over the lazy dog
quick brown foxes leap over lazy dogs in summer
為了建立倒排索引,我們首先切分每個文件的content
欄位為單獨的單詞(我們把它們叫做詞(terms)或者表徵(tokens))(譯者注:關於terms
和tokens
的翻譯比較生硬,只需知道語句分詞後的個體叫做這兩個。),把所有的唯一詞放入列表並排序,結果是這個樣子的:
term
doc_1
doc_2
quick
xthe
xbrownxx
dogx
dogs
xfox
xfoxesxin
xjumped
xlazyxx
leap
xoverxx
quick
xsummer
xthe
x現在,如果我們想搜尋"quick brown"
,我們只需要找到每個詞在哪個文件**現即可:
term
doc_1
doc_2
brownxx
quick
x-----
-------
-----
total21
兩個文件都匹配,但是第乙個比第二個有更多的匹配項。 如果我們加入簡單的相似度演算法(similarity algorithm),計算匹配單詞的數目,這樣我們就可以說第乙個文件比第二個匹配度更高——對於我們的查詢具有更多相關性。
但是在我們的倒排索引中還有些問題:
"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
brownxx
dogx
xfo***
inxjumpxx
lazyxx
overxx
quickxx
summer
xthexx
但我們還未成功。我們的搜尋"+quick +fox"
依舊失敗,因為"quick"
的確切值已經不在索引裡,不過,如果我們使用相同的標準化規則處理查詢字串的content
字段,查詢將變成"+quick +fox"
,這樣就可以匹配到兩個文件。
這很重要。你只可以找到確實存在於索引中的詞,所以索引文字和查詢字串都要標準化為相同的形式。這個標記化和標準化的過程叫做分詞(analysis)
Elasticsearch 倒排索引
elasticsearch 使用一種稱為倒排索引的結構,它適用於快速的全文搜尋。乙個倒排索引由文件中所有不重複詞的列表構成,對於其中每個詞,有乙個包含它的文件列表。假設我們有兩個文件,每個文件的 content 域包含如下內容 the quick brown fox jumped over the ...
elasticsearch 倒排索引原理
elasticsearch 使用一種稱為 倒排索引 的結構,它適用於快速的全文搜尋。乙個倒排索引由文件中所有不重複詞的列表構成,對於其中每個詞,有乙個包含它的文件列表。例如,假設我們有兩個文件,每個文件的content域包含如下內容 the quick brown fox jumped over t...
ElasticSearch關於倒排索引
在我們說倒排索引的時候讓我們先去了解一下什麼叫做正排索引 在說倒排索引之前我們先說說什麼是正排索引。正排索引也稱為 前向索引 它是建立倒排索引的基礎。這種組織方法在建立索引的時候結構比較簡單,建立比較方便且易於維護 因為索引是基於文件建立的,若是有新的文件加入,直接為該文件建立乙個新的索引塊,掛接在...