Elasticsearch搜尋調優權威指南 (2/3)
本文首發於 vivo網際網路技術 微信公眾號 https://mp.weixin.qq.com/s/AAkVdzmkgdBisuQZldsnvg
英文原文: https://qbox.io/blog/elasticsearch-search-tuning-part-2
作者:Adam Vanderbush
譯者:楊振濤
目錄
- 預索引資料
- 對映
- 避免使用指令碼
- 強制合併只讀索引
Elasticsearch搜尋調優權威指南,是QBOX在其部落格上釋出的系列文章之一,本文是該系列的第二篇,主要介紹了索引預處理、mapping建立、避免指令碼的使用、索引段合併等搜尋效能相關的調優方法。
本文是Elasticsearch搜尋調優系列文章3篇中的第2篇, 第1篇參考這裡(點選) 。本系列教程旨在更進一步討論針對Elasticsearch 5.0及以上版本的搜尋調優技術、策略及建議。
1.預索引資料
為了最佳化資料的索引方式,應當在查詢中預置一些模式。比如,如果所有文件都有一個叫 price 的價格欄位,並且大部分查詢在一個固定範圍列表上執行 range 聚合,那麼就可以透過預索引範圍到索引中並使用一個 terms 聚合,來加速該聚合。
比如有如下文件:
curl -XPUT 'ES_HOST:ES_PORT/index/type/1 ?pretty' -H 'Content-Type: application/json' -d '{ "designation": "bowl", "price": 13 }'
以及如下搜尋請求:
curl -XGET 'ES_HOST:ES_PORT/index/_search ?pretty' -H 'Content-Type: application/json' -d '{ "aggs": { "price_ranges": { "range": { "field": "price", "ranges": [ { "to": 10 }, { "from": 10, "to": 100 }, { "from": 100 } ] } } } }'
然後就可以在索引階段增加一個 price_range 欄位,該欄位應該對映為一個關鍵字:
curl -XPUT 'ES_HOST:ES_PORT/index ?pretty' -H 'Content-Type: application/json' -d '{ "mappings": { "type": { "properties": { "price_range": { "type": "keyword" } } } } }' curl -XPUT 'ES_HOST:ES_PORT/index/type/1 ?pretty' -H 'Content-Type: application/json' -d '{ "designation": "bowl", "price": 13, "price_range": "10-100"}'
接下來搜尋請求就能聚合這個新的欄位,而不是在 price 欄位上執行一個範圍聚合。
curl -XGET 'ES_HOST:ES_PORT/index/_search ?pretty' -H 'Content-Type: application/json' -d '{ "aggs": { "price_ranges": { "terms": { "field": "price_range" } } } }'
事實上,一些數值型的資料,並不意味著總是要被對映為一個數值型欄位。典型的,那些儲存為諸如 ISBN 之類的識別符號,或者任何標識另一個資料庫中記錄的數字的欄位,可能對映為關鍵字比對映為一個 integer 或 long 型別更好。
關鍵字型別用於索引結構化內容,比如 email 地址、主機名稱、狀態碼、郵政編碼或標籤。
典型地用於過濾(比如查詢所有已釋出的部落格文章)、排序以及聚合。關鍵字欄位只可透過其精確值搜尋得到。
如果需要索引全文內容比如 email 內容或產品描述,可能就要使用一個文字欄位。
下面是一個關鍵字欄位對映的示例:
curl -XPUT 'ES_HOST:ES_PORT/my_index ?pretty' -H 'Content-Type: application/json' -d '{ "mappings": { "my_type": { "properties": { "tags": { "type": "keyword" } } } } }'
從 2.x 版本匯入的索引是不支援關鍵字的;相反,它們會試圖把 keyword 型別降級為 string 型別。這支援合併新的對映和舊的對映。長期存在的索引,必須在升級到 6.x 版本前重建,但是對映降級提供了按自己的計劃實施重建的機會。
3.避免使用指令碼
一般來說要儘量避免使用指令碼;如果必須要使用,優先選擇 Painless 和表示式引擎。
Painless 是一門簡單安全的指令碼語言,專門為在 Elasticsearch 中使用而設計,是 Elasticsearch 的預設指令碼語言,可安全地用於內聯和儲存指令碼。關於 Painless 語法和語言特性的更詳細描述,請參考 Painless 語言規範。
請參考 “ Painless Scripting in Elasticsearch ” 更深入地瞭解 Painless 指令碼語言指南。
- Lucene 表示式語言
Lucene 表示式會把一個 javascript 表示式編譯為位元組碼,設計用於高效能自定義評級和排序函式,並支援 inline 和預設的儲存指令碼。
- 效能
表示式相對於自定義 Lucene 程式碼而言 , 有著更好的效能表現;其效能相對其他指令碼引擎有更低的單文件成本:表示式更加“領先”。
這就允許非常快的執行,尤其是比自己寫的本地指令碼快很多。
- 語法
表示式支援一個 ja vascript 語法子集:一個單獨的表示式。參見表示式模組的文件,瞭解支援的運算子和函式。
表示式指令碼中可訪問的變數有:
-
文件欄位,比如doc['myfield'].value
-
欄位所支援的變數和方法,比如doc['myfield'].empty
-
傳遞到指令碼里的引數,比如mymodifier
-
當前文件得分,_score(僅在 script_score中使用時有效)
表示式指令碼可以用於script_score、script_fields、排序指令碼以及數值型聚合指令碼,只要簡單地設定引數到表示式中即可。
4.強制合併只讀索引
只讀索引在合併為單一的段後將會非常受益。典型的情況是基於時間的索引:只有當前時間窗的索引會成為新文件,同時舊索引成為只讀。
強制合併 API 支援透過 API 強制合併一個或更多的索引。合併與每個分片中 Lucene 索引的段數量有關。強制合併操作支援透過合併來減少段數量。
該呼叫在合併完成之前將會處於阻塞狀態。如果 http 連線斷掉,請求將在後臺繼續,在前一個強制合併完成之前,所有新請求將會阻塞。
curl _XPOST 'ES_HOST:ES_POST/twitter/_forcemer ge?pretty'
強制合併 API 接受下列請求引數:
-
max_num_segments - 待合併的段數量。要完全合併索引,可設定為 1 。預設會簡單檢查一個合併是否需要執行,如果是,就會執行。
-
only_expunge_deletes -合併流程是否僅僅擦除包含刪除的段。在 Lucene 中,一個文件並不會從一個段直接刪除,只是標記為刪除。在一個段合併的過程中,一個新的段可能會被建立,這個新的段並不包含那些刪除。這個標記引數支援只合並有刪除的段,且預設為 false 。注意,這並不會重寫閾值 index.merge.policy.expunge_deletes_allowed。
-
flush - 強制合併後是否執行 flush ,預設為 true 。
來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/69912579/viewspace-2649487/,如需轉載,請註明出處,否則將追究法律責任。
相關文章
- Elasticsearch搜尋調優權威指南 (1/3)Elasticsearch
- Elasticsearch 權威指南(中文版)Elasticsearch
- [Elasticsearch] 多欄位搜尋 (二) - 最佳欄位查詢及其調優(轉)Elasticsearch
- Elasticsearch常用搜尋Elasticsearch
- Elasticsearch——全文搜尋Elasticsearch
- elasticsearch搜尋商品Elasticsearch
- Elasticsearch 向量搜尋Elasticsearch
- 搜尋引擎ElasticSearch18_ElasticSearch的客戶端操作2Elasticsearch客戶端
- ElasticSearch全文搜尋引擎Elasticsearch
- elasticsearch之拼音搜尋Elasticsearch
- Elasticsearch 為了搜尋Elasticsearch
- JavaScript權威指南(2)——詞法結構JavaScript
- Elasticsearch(ES)的高階搜尋(DSL搜尋)(上篇)Elasticsearch
- Elasticsearch(ES)的高階搜尋(DSL搜尋)(下篇)Elasticsearch
- elasticsearch(五)---分散式搜尋Elasticsearch分散式
- 認識搜尋引擎 ElasticsearchElasticsearch
- (1)分散式搜尋ElasticSearch認識ElasticSearch分散式Elasticsearch
- JavaScript 日期權威指南JavaScript
- Nebula 基於 ElasticSearch 的全文搜尋引擎的文字搜尋Elasticsearch
- 搜尋引擎ElasticSearch18_ElasticSearch簡介1Elasticsearch
- Elasticsearch 實現簡單搜尋Elasticsearch
- Laravel 使用 Elasticsearch 全域性搜尋LaravelElasticsearch
- Laravel + Elasticsearch 實現中文搜尋LaravelElasticsearch
- 【elasticsearch】搜尋過程詳解Elasticsearch
- Elasticsearch搜尋資料彙總Elasticsearch
- ElasticSearch效能調優Elasticsearch
- [譯] JAVASCRIPT 日期權威指南JavaScript
- Java 13權威指南 - CodeFXJava
- JavaScript權威指南(6)——物件JavaScript物件
- Oracle Database 12cR2多租戶權威指南OracleDatabase
- ElasticSearch 簡單的 搜尋 聚合 分析Elasticsearch
- elasticsearch實現基於拼音搜尋Elasticsearch
- Elasticsearch核心技術(五):搜尋API和搜尋執行機制ElasticsearchAPI
- 開放搜尋開源相容版,支援Elasticsearch做搜尋召回引擎Elasticsearch
- 深度優先搜尋
- Elasticsearch調優實踐Elasticsearch
- 搜尋引擎ElasticSearch18_ElasticSearch程式設計操作5Elasticsearch程式設計
- javascript權威指南——函式篇JavaScript函式