elasticsearch 使用一種稱為 倒排索引 的結構,它適用於快速的全文搜尋。乙個倒排索引由文件中所有不重複詞的列表構成,對於其中每個詞,有乙個包含它的文件列表。
例如,假設我們有兩個文件,每個文件的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_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 +fox
不會得到任何匹配文件。(記住,+
字首表明這個詞必須存在。)只有同時出現quick
和fox
的文件才滿足這個查詢條件,但是第乙個文件包含quick fox
,第二個文件包含quick foxes
。
我們的使用者可以合理的期望兩個文件與查詢匹配。我們可以做的更好。
如果我們將詞條規範為標準模式,那麼我們可以找到與使用者搜尋的詞條不完全一致,但具有足夠相關性的文件。例如:
現在索引看上去像這樣:
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
,這樣兩個文件都會匹配!
Elasticsearch 倒排索引
elasticsearch 使用一種稱為倒排索引的結構,它適用於快速的全文搜尋。乙個倒排索引由文件中所有不重複詞的列表構成,對於其中每個詞,有乙個包含它的文件列表。假設我們有兩個文件,每個文件的 content 域包含如下內容 the quick brown fox jumped over the ...
Elasticsearch( )倒排索引
elasticsearch 使用一種叫做 倒排索引 inverted index 的結構來做快速的全文搜尋。倒排索引由在文件 現的唯一的單詞列表,以及對於每個單詞在文件中的位置組成。例如,我們有兩個文件,每個文件content字段包含 the quick brown fox jumped over ...
ElasticSearch關於倒排索引
在我們說倒排索引的時候讓我們先去了解一下什麼叫做正排索引 在說倒排索引之前我們先說說什麼是正排索引。正排索引也稱為 前向索引 它是建立倒排索引的基礎。這種組織方法在建立索引的時候結構比較簡單,建立比較方便且易於維護 因為索引是基於文件建立的,若是有新的文件加入,直接為該文件建立乙個新的索引塊,掛接在...