Elastisearch的實現原理是什麼?主要應用場景是什麼?

白色黑牆


ElasticSearch(業界常稱為ES)是一個全文搜索引擎,其特點為分佈式,易擴展,實時文件存儲與提取!

ES的底層使用Apache鼎鼎大名的Lucence開源框架實現,嚴格來說lucence只屬於一個工具包,提供了簡單的接口用於實現全文檢索!

lucence有什麼用呢?

想想我們使用天貓購物的時候,假設輸入一個床,整個頁面能顯示木板床,水床,甚至有床墊,床單等購物信息出現,就是因為所有這些與床有關的信息錄入時,以“床”這個詞作為分詞,建立索引,從而能得到各種與床有關的店鋪,商品等等!


如果用mysql,怎麼實現呢,一大段商品信息描述,使用like'%床%'來查詢,本來就不走索引,字段還很大,別說億級別的數據了,幾百萬就能把一臺mysql服務器搞死!

那麼ES怎麼做的呢?跟mysql的查找方式相反,mysql是從文檔中提取關鍵字,而使用ES可以先提取出關鍵字(使用特定的分詞器),然後關鍵字出現的位置,建立倒排索引,明確的記錄關鍵詞所在的位置,舉例截圖如下:


圖中的箭頭所示的一列數據叫做Posting List,就是存放關鍵字對應的位置;這樣在查詢羽毛球的時候,能迅速返回證件號1的數據,查年齡20的時候,能迅速返回證件號2,3對應的數據;

圖中的Term就是Term Dictionary(字典),ES對字段Term Dictionary進行了排序,然後使用二分法查找數據,查找到的效率為O(logN),為了避免磁盤IO的低性能,ES可以把字典放在了內存中來提升查詢性能,那麼問題來了,如果是億萬級的數據,年齡還好,但是愛好可能也是億萬級別的量,這時候內存可能就要爆了,於是就有了Term Index,就是將Term Dictionary再進行一次索引,比如說羽毛球這個詞,建立一個索引樹,使用羽字就可以定位到羽字開頭的所有Term Dictionary,然後在使用二分法查找到需要的關鍵詞,這樣就可以只把Term Index放入內存,從而提升整個ES系統的處理能力;


上面就是ES大概的原理,當然遠不止於此,作為大數據領域中文檔處理的佼佼者,ES大量使用在日誌記錄與分析,全文檢索,數據統計等等情景中!

以上是ES簡單的原理說明,對於分詞器選擇,字典樹壓縮,如何使用等更多的東西沒有描述,以後找機會會詳細分享一次,請關注。。。


哎喲JAVA不錯哦


Elastic主要用於快速儲存、搜索和分析海量的數據。它的底層是基於開源庫Lucene。

Elastic是面向文檔型數據庫,一條數據就是一個文檔。在插入數據的時候,elastic就默默的為插入這些字段都建立的索引--倒排索引。而倒排索引是比mysql的B+樹索引更快的索引。

而且如果多個字段聯合查詢就利用跳錶快速做與運算或者bitset按位與。

主要應用場景 站內搜索,日誌數據分析,BI系統等。


yes的練級攻略


es實現原理就是利用了Lucence框架實現索引,支持分佈式部署,性能非常高。現在用的比較廣泛,如:網站的全文搜索,數據的統計分析等。

如果項目需要選型,推薦使用es


分享到:


相關文章: