1. 程式人生 > >elasticsearch倒排索引與TF-IDF演算法

elasticsearch倒排索引與TF-IDF演算法

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.