elasticsearch-倒排索引原理

(轉(zhuǎn)載自CSDN 豆不女 https://blog.csdn.net/chuan442616909/article/details/55100757?utm_source=blogxgwz0)

倒排索引

Elasticsearch 使用一種稱為倒排索引的結(jié)構(gòu),它適用于快速的全文搜索。一個倒排索引由文檔中所有不重復(fù)詞的列表構(gòu)成,對于其中每個詞,有一個包含它的文檔列表。

es使用稱為倒排索引的結(jié)構(gòu)達(dá)到快速全文搜索的目的。

一個倒排索引包含一系列不同的單詞,這些單詞出現(xiàn)在任何一個文檔,

對于每個單詞,對應(yīng)著所有它出現(xiàn)的文檔。

倒排索引建立的是分詞(Term)和文檔(Document)之間的映射關(guān)系,在倒排索引中,數(shù)據(jù)是面向詞(Term)而不是面向文檔的。


term和Doc之間呈現(xiàn)的關(guān)系

例如,假設(shè)我們有兩個文檔,每個文檔的content域包含如下內(nèi)容:

The quick brown fox jumped over the lazy dog

Quick brown foxes leap over lazy dogs in summer

為了創(chuàng)建倒排索引,我們首先將每個文檔的content域拆分成單獨(dú)的 詞(我們稱它為詞條或tokens),創(chuàng)建一個包含所有不重復(fù)詞條的排序列表,然后列出每個詞條出現(xiàn)在哪個文檔。結(jié)果如下所示:

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? |

------------------------

現(xiàn)在,如果我們想搜索quick brown,我們只需要查找包含每個詞條的文檔:

Term? ? ? Doc_1? Doc_2

-------------------------

brown? |? X? |? X

quick? |? X? |

------------------------

Total? |? 2? |? 1

兩個文檔都匹配,但是第一個文檔比第二個匹配度更高。如果我們使用僅計(jì)算匹配詞條數(shù)量的簡單相似性算法,那么,我們可以說,對于我們查詢的相關(guān)性來講,第一個文檔比第二個文檔更佳。

但是,我們目前的倒排索引有一些問題:

Quick和quick以獨(dú)立的詞條出現(xiàn),然而用戶可能認(rèn)為它們是相同的詞。

fox和foxes非常相似, 就像dog和dogs;他們有相同的詞根。

jumped和leap, 盡管沒有相同的詞根,但他們的意思很相近。他們是同義詞。

使用前面的索引搜索+Quick +fox不會得到任何匹配文檔。(記住,+前綴表明這個詞必須存在。)只有同時出現(xiàn)Quick和fox的文檔才滿足這個查詢條件,但是第一個文檔包含quick fox,第二個文檔包含Quick foxes。

我們的用戶可以合理的期望兩個文檔與查詢匹配。我們可以做的更好。

如果我們將詞條規(guī)范為標(biāo)準(zhǔn)模式,那么我們可以找到與用戶搜索的詞條不完全一致,但具有足夠相關(guān)性的文檔。例如:

Quick可以小寫化為quick。

foxes可以詞干提取--變?yōu)樵~根的格式-- 為fox。類似的,dogs可以為提取為dog。

jumped和leap是同義詞,可以索引為相同的單詞jump。

現(xiàn)在索引看上去像這樣:

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

------------------------

這還遠(yuǎn)遠(yuǎn)不夠。我們搜索+Quick +fox仍然會失敗,因?yàn)樵谖覀兊乃饕?,已?jīng)沒有Quick了。但是,如果我們對搜索的字符串使用與content域相同的標(biāo)準(zhǔn)化規(guī)則,會變成查詢+quick +fox,這樣兩個文檔都會匹配!

最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點(diǎn),簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

友情鏈接更多精彩內(nèi)容