當前位置:成語大全網 - 漢語詞典 - elastic search:ES倒排索引為什麽查詢速度這麽快?

elastic search:ES倒排索引為什麽查詢速度這麽快?

Elasticsearch是壹個分布式、可擴展的實時搜索和分析引擎,建立在全文搜索引擎Apache Lucene?在…的基礎上。Elasticsearch可以通過多種技術手段實現近實時檢索。本文將從反向索引和$ Term索引這兩個知識點入手,分析彈性搜索如此之快的原因。

在上表所示的“文檔-關鍵詞”矩陣索引中,如果用戶使用搜索引擎搜索壹個目標關鍵詞(如Mars),搜索引擎會從索引庫中的所有關鍵詞即web_x_1和web_x_2中收錄Mars的文檔,並根據網頁文件本身的值分值(如關鍵詞出現的次數)按順序顯示給用戶,用戶得到的按順序顯示。這是正向索引的壹般過程。

在這個矩陣中,預先找到了所有與Mars關鍵詞對應的網頁,甚至預先計算了網頁文檔的權重並進行排序。當用戶輸入Mars關鍵詞,會立刻得到web _ x _ 2和web _ x _ 1的反饋結果。

這裏可能有人會想,是不是關鍵詞太多超過了網頁的數量,效率才不會變低。事實上,人類語言詞匯的數量是相對有限和固定的,但網頁的數量是沒有上限的。比如中文,有3萬個漢字,40萬個左右的詞匯,但中文網站的數量遠不止這些。

需要註意的是,每個詞對應的文檔數是動態變化的,所以倒排表的建立和維護比較復雜。但在查詢時,可以壹次性得到查詢關鍵詞對應的所有文檔,因此倒排表的效率更高。

對於該表,Elasticsearch將創建以下索引:

索引1:名稱

索引2:顏色

指數3:比率

在這個索引中,名稱、顏色、費率的字段稱為歸檔,而iphone 666 plus、藍色、中間的字段稱為$ Term,所有與$ Term對應的產品的id,如【1,3】,就是過賬列表。

當用戶想找壹個Color=blue的產品時,可以通過索引三中的$ Term和Posting List快速找到,目標是壹個id為2的產品,然後可以通過索引壹找到產品名稱華為mate 98k。

上面簡單解釋了$ Term和Posting List,但是在實際制作中,Elasticsearch需要面對數以億計的數據記錄,而數據$ Term的數量是驚人的,所以往往需要花費大量的時間才能命中,而且大部分時候搜索是多條件的,需要多次重復搜索,效率還是不高。

這時候就需要優化$ Term的排序,也就是用二分搜索法查找$ Term,類似於查字典,叫做$ Term字典。

同樣在上面的例子中,在名稱、顏色和比率這三個索引下的所有$ Term按照英文字母表中第壹個字母的位置排序如下:

當用戶想找壹個高費率的商品時,可以通過二分法快速找到,搜索過程的時間復雜度為log N,大大提高了搜索速度。關於二分搜索法,我在這裏就不贅述了。如果妳不知道,朋友們可以自行百度或點擊二分搜索法了解更多信息。

這裏很多人會有疑問,那麽這和傳統的B樹有什麽區別呢?有必要引入另壹個概念,$ Term指數。

事實上,$ Term索引也可以理解為壹個樹形結構。第壹級排序從$ Term的第壹個字母開始。如果有多個首字母相同的$ Term,第二級排序從該字母開始。如果只有壹個以該字母為首的$ Term,則不會進行第二次排序。

同樣是上面的例子,它的$ Term索引如下圖所示:

上圖中有兩個以字母B開頭的$ Term,分別是藍色和黑色,所以我們需要對第二個字母進行排序,也就是對第二個字母進行排序。這時我們發現兩個$ Term的第二個字母是L,於是在第三層排序,第三層排序的結果是bla和blu,分別對應兩個$ Term,黑色和藍色,以及[1,3]和2。對應關系如下圖所示:

需要保存在$ Term索引中的是$ Term字段的第壹部分以及與$ Term字典的映射關系,這減少了存儲的信息量。結合FST (Refine State Translator)壓縮技術,可以將$ Term索引壓縮到足夠小,以便緩存在服務器內存中。這樣,用戶搜索時,先從內存中的$ Term索引中找到$ Term字典中的位置映射關系,然後到磁盤中找到對應的$ Term,再找到對應的Posting List,大大減少了磁盤讀取次數,提高了效率和速度。

FST壓縮技術請參考本文:/blog/2018/12/04/Lucene-FST/。如果妳擅長英語,妳可以閱讀這篇https://cs.nyu.edu/~mohri/pub/fla.pdf,的文章,裏面有關於FST的詳細解釋。

先在這裏埋個坑,以後有空再填。