如何提高elasticsearch的查詢速度?

如何提高elasticsearch的查詢速度?
2 個回答
网络圈
2019-06-05

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

ElasticSearch的定位是什麼?

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

參與過搜索、數據分析等項目的開發者對於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",

"index.search.slowlog.threshold.fetch.debug": "500ms",

"index.indexing.slowlog.threshold.index.info": "5s"

}

ES查詢性能優化方案

1、升級硬件配置(硬盤、內存)

對於硬盤建議選用SSD,它比機械硬盤讀寫速度更快,另外內存需要適時調整。

2、JVM參數調優

要知道ES是用Java開發的,跑在JVM中,如果JVM參數設置不當也會影響ES的性能!ES安裝後默認的堆內存是1G,這個值太小了,需要適當調大。

3、加大文件系統緩存設置

ES依懶底層的FileSystem Cache,文件系統緩存值若太小則會導致ES查詢時會從硬盤中查詢,效率低。若文件系統緩存大小設置合理,則很多查詢可以直接從緩存內查詢。

4、減少副本數量

ES默認副本是3個,副本越多雖然能提高集群的可用性,但是也增加了搜索的併發數、也會影響索引寫入效率。所以建議副本不要過多,一般1~3個足夠了。

5、禁止深度分頁

ES它的分頁效率很低(若每頁10條,查詢第100頁時,ES實際查詢的是每個Shard中的1000條數據進行處理後再返回第100頁裡的10條數據),頁數越靠後,CPU消耗越大,查詢效率越低!所以我們要禁止深度分頁。

6、Filter 比 Query 效率好

Filter查詢結果可以緩存,而且不需要像Query那樣計算相關性分值,所以Filter效率更高。


以上就是我的觀點,對於這個問題大家是怎麼看待的呢?歡迎在下方評論區交流 ~ 我是科技領域創作者,十年互聯網從業經驗,歡迎關注我瞭解更多科技知識!

哎哟JAVA不错哦
2019-04-24

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

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

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

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

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

比如下圖:

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

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

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

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

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

比如下圖:

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

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

數據的增刪改查一直都是互聯網最基本的需求!而這些操作的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,需要的同學,敬請關注。。。

相關推薦

推薦中...