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簡單的原理說明,對于分詞器選擇,字典樹壓縮,如何使用等更多的東西沒有描述,以后找機會會詳細分享一次,請關注。。。