如何提高elasticsearch的查詢速度?

王昆立


參與過搜索、數據分析等項目的開發者對於ElasticSearch較為熟悉,雖說ES目前應用廣泛,但其實它的性能並非我們想像的那麼好。

ElasticSearch的定位是什麼?

ElasticSearch(簡稱ES)是用Java編程語言開發的基於Lucene的一款企業級搜索引擎服務器。它支持分佈式部署,而且對外提供了RESTful API,便於各類編程語言調用。

ES性能並非想像中的那麼好

ES數據量一大時,特別是第一次搜索的時候耗時會很久(甚至10s以上)。也不要認為改個參數就能改善所有性能慢的場景。

通過ES慢日誌可分析查詢效率

ES提供了慢日誌,但默認是沒有開啟的。ES中的慢日誌主要分兩類:索引慢日誌、搜索慢日誌。如何開啟呢?參考如下:

PUT /my_index/_settings

{

"index.search.slowlog.threshold.query.warn" : "10s\

網絡圈


數據的增刪改查一直都是互聯網最基本的需求!而這些操作的90%都是查!!!

上世紀60年代,數據查詢需求旺盛,關係型數據查詢蓬勃發展,誕生了各種各樣的數據庫和SQL語言!數據庫查詢效率極高,建立索引也只能為字段的粒度!如果是想要對字段中的某些數據做查詢,只能使用like語句,逐字匹配,查詢效率不高!

這時候全文搜索就能體現出更為強大的效率!

全文搜索是對所有的數據進行拆分,對每一個詞都分別建立索引,記錄詞語所在的位置和出現的次數,然後在查詢的時候能快速找到文檔所在處,實現快速查詢!

比如1,我是一個兵!2,我愛你!兩句話會分別拆分之後保存到一個索引文檔中進行維護,比如說我字就會保存有兩次的頻率,並且在兩句話中都有出現,在搜索"我"字的時候,就能把兩句話搜索出來!

比如下圖:

不管是淘寶,百度網頁等都是通過對鏈接或者標題等進行索引保存,在關鍵字搜索的時候就能選擇出關鍵詞所在的標題,根據相關度進行排序,最後查詢出所有需要的標題進行顯示!

而全文搜索的實現都很多,包括底層的lucence,企業級應用solr,elasticsearch等等!elasticsearch因為其天然的分佈特性,和便於大量水平擴展的特性,restful的服務接口收到廣泛關注和使用!



瞭解全文搜索基本原理以後,本文不對elasticsearch的原理,集群使用,索引分片,傳輸協議展開來講,而且因為elasticsearch是開源的,可以通過簡單的配置就能方便使用,而不用關注其內部實現,回到問題所在,怎麼才能更快的搜索?

1,服務器內存要大一點,因為索引加載需要大量內存,並且最大最小內存設置相同值,防止GC時候的大量stop the world!

2,設置合理的索引刷新時間,indwx.fresh_interval如果設置過大,索引查不到容易導致異常,設置太小,服務器壓力會很大!

3,禁用_all,打開會導致拷貝增加,查詢效率變低!

4,防止設置過多的分片副本,增大合併時間,影響查詢效率!

5,優化查詢返回字段,減少內存佔用!

6,添加查詢緩存!

elasticsearch是一門分佈式搜索技術,涉及到的知識點很多,沒辦法簡單介紹,找時間會詳細的討論並奉上Demo,需要的同學,敬請關注。。。


分享到:


相關文章: