elasticsearch倒排索引與TF-IDF算法

elasticsearch專欄:https://www.cnblogs.com/hello-shf/category/1550315.htmlhtml

1、倒排索引(Inverted Index)簡介

在關係數據庫系統裏,索引是檢索數據最有效率的方式。但對於搜索引擎,它並不能知足其特殊要求,好比海量數據下好比百度或者谷歌要搜索百億級的網頁,若是使用相似關係型數據庫使用的B+樹索引,可想而知其對cpu的計算能力要求得有多高。其次關係型數據庫中通常存儲的都是結構化的數據,數據格式都是必定的,操做上通常也都是curd等比較簡單的操做。算法

倒排索引區別於正向索引,通常的倒排索引被用來作全文搜索。好比如今有一本10w字的書,單詞使用量爲3k,我要從中搜索某個詞出現的章節,咱們該怎麼作?數據庫

正排索引:遍歷這本書,記錄該次出現的章節。咱們幾乎要遍歷完10w個詞才能統計完。elasticsearch

倒排索引:創建倒排索引,將每一個詞做爲key,該詞出現的章節爲value。咱們只要在3k個單詞中找到咱們的目標詞便可。post

這樣的話,顯然倒排索引對於全文搜索性能更好。(上面舉得例子不太好,湊合吧)性能

通常的正排索引是以key找value,而倒排索引則是以value找key。反轉了key-value的關係。優化

 

2、es中的倒排索引

在es中text類型字段默認只會創建倒排索引,其它幾種類型在創建倒排索引的時候還會創建正排索引,固然es是支持自定義的。在這裏這個正排索引其實就是Doc Value。本章節咱們主要是介紹倒排索引。下面咱們介紹一個例子,看看倒排索引是如何創建的。ui

好比咱們有兩個doc(document 文檔),都有一個content字段搜索引擎

doc_1:The quick brown fox jumped over the lazy dogurl

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優化以後,咱們再看看這個倒排索引:

 

 當倒排索引如上所示,咱們很容易就能進行全文搜索。

 

3、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-權威指南》

 

  若有錯誤的地方還請留言指正。

  原創不易,轉載請註明原文地址:http://www.javashuo.com/article/p-scqsdanv-bx.html

相關文章
相關標籤/搜索