elasticsearch專欄:https://www.cnblogs.com/hello-shf/category/1550315.html
一、倒排索引(Inverted Index)簡介
在關系數據庫系統里,索引是檢索數據最有效率的方式。但對於搜索引擎,它並不能滿足其特殊要求,比如海量數據下比如百度或者谷歌要搜索百億級的網頁,如果使用類似關系型數據庫使用的B+樹索引,可想而知其對cpu的計算能力要求得有多高。其次關系型數據庫中一般存儲的都是結構化的數據,數據格式都是一定的,操作上一般也都是curd等比較簡單的操作。
倒排索引區別於正向索引,一般的倒排索引被用來做全文搜索。比如現在有一本10w字的書,單詞使用量為3k,我要從中搜索某個詞出現的章節,我們該怎么做?
正排索引:遍歷這本書,記錄該次出現的章節。我們幾乎要遍歷完10w個詞才能統計完。
倒排索引:建立倒排索引,將每個詞作為key,該詞出現的章節為value。我們只要在3k個單詞中找到我們的目標詞即可。
這樣的話,顯然倒排索引對於全文搜索性能更好。(上面舉得例子不太好,湊合吧)
一般的正排索引是以key找value,而倒排索引則是以value找key。反轉了key-value的關系。
二、es中的倒排索引
在es中text類型字段默認只會建立倒排索引,其它幾種類型在建立倒排索引的時候還會建立正排索引,當然es是支持自定義的。在這里這個正排索引其實就是Doc Value。本章節我們主要是介紹倒排索引。下面我們介紹一個例子,看看倒排索引是如何建立的。
比如我們有兩個doc(document 文檔),都有一個content字段
doc_1:The quick brown fox jumped over the lazy dog
doc_2:Quick brown foxes jump over lazy dogs in summer
首先在es底層分詞器會對doc進行分詞,得到一個個term(單詞),然后建立一個映射關系,記錄存在各個單詞的文檔。首先我們分析一下各個單詞存在的文檔。

因為每個doc都是由id唯一標識的,所以其會建立一個映射關系。

當es建立了這種映射關系,當我們搜索一個單詞的時候,是不是就不需要遍歷每個文檔了呢。當然,es的倒排索引並不會這么簡單。
term優化,比如我們用百度搜索“JUmped”這個詞

很容易發現,竟然區分好了大小寫,並且還只能的匹配到了不同的時態。所以es同樣也是這樣的,es的分詞器會對單詞進行一定的處理,比如:
1 大小寫轉換:Quick --> quick 2 近義詞轉換:mother --> mom 3 時態轉換:jumped --> jump 4 單復數轉換:dogs --> dog
......
注意:不同的分詞器的分詞方式和算法都是不盡相同的。要注意這一點。
當es進行了term優化之后,我們再看看這個倒排索引:

當倒排索引如上所示,我們很容易就能進行全文搜索。
三、TF-IDF算法
TF-IDF(term frequency–inverse document frequency)是一種用於資訊檢索與資訊探勘的常用加權技術。TF-IDF是一種統計方法,用以評估一字詞對於一個文件集或一個語料庫中的其中一份文件的重要程度。字詞的重要性隨着它在文件中出現的次數成正比增加,但同時會隨着它在語料庫中出現的頻率成反比下降。TF-IDF加權的各種形式常被搜尋引擎應用,作為文件與用戶查詢之間相關程度的度量或評級。除了TF-IDF以外,因特網上的搜尋引擎還會使用基於連結分析的評級方法,以確定文件在搜尋結果中出現的順序。
Term frequency:搜索文本中的各個詞條在field文本中出現了多少次,出現次數越多,就越相關
在es中進行全文搜索時,搜索結果的匹配度也是采用的TF-IDF算法。這個匹配度是能夠在es的元數據 _score 屬性中體現出來的。通過實驗驗證一下。
首先建立一個索引
PUT /my_index?pretty
插入數據
1 PUT /my_index/my_index_type/1 2 { 3 "content":"The quick brown fox jumped over the lazy dog" 4 } 5 PUT /my_index/my_index_type/2 6 { 7 "content":"Quick brown foxes jump over lazy dogs in summer" 8 }
搜索
1 GET /my_index/my_index_type/_search 2 { 3 "query":{ 4 "match":{ 5 "content": "quick" 6 } 7 } 8 }
搜索結果

通過以上結果我們很容易發現,es通過TF-IDF算法計算出來了相關度 _score。並且還勿略了大小寫。
如果我們搜索單詞“summer”,結果如下所示,只匹配到了doc1。

參考文獻:
《elasticsearch-權威指南》
如有錯誤的地方還請留言指正。
原創不易,轉載請注明原文地址:https://www.cnblogs.com/hello-shf/p/11543460.html
