轉載自:https://www.jianshu.com/p/323547de1bb2
ElasticSearch(ES)反向索引原理
- Elasticsearch(ES)使用稱為反向索引的結構達到快速全文搜尋的目的
- 一個反向索引由文檔中所有不重複詞的清單構成
- 對于其中每個詞,有一個包含它的文檔清單
- 反向索引建立的是分詞(Term)和文檔(Document)之間的映射關系,在反向索引中,資料是面向詞(Term)而不是面向文檔的
例如,假設我們有兩個文檔,每個文檔的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,這樣兩個文檔都會比對!