在使用ES時,我們常見的就是需要生成一個template來定義索引的設定,分詞器,Mapping.本文将基于項目經驗來總結一些常用的配置。
Index設定
- index.refresh_interval
配置一個重新整理時間,将index buffer重新整理到os cache的時間間隔,重新整理到os cache的資料才可以被索引到,預設是1s.如果對實時性搜尋要求不高的地方,可設定時間為30s,提高性能。
- number_of_replicas
對于叢集資料節點 >=2 的場景,建議副本至少設定為 1(一主一從,共兩個副本), 可以提高叢集容錯和搜尋吞吐量(副本分片可用于查詢)。
- index.number_of_shards
主副本的分片數,預設是5個,最大值限制為1024個,這個值是分片數可适當的增加,提高索引的并發性能,但是分片越多,也會導緻資源耗費越高,索引要根據通路并發數和ES叢集的資源來設定。經驗公式:分片數 = 索引大小/分片大小經驗值 30GB,官方推薦Shard值在 20-40GB性能最好,日志類:單分片<50GB;搜尋類:單分片<20GB。不足100G,可直接設定3-5個分片(結合節點數和擴充性),超過100G則可以按照如上經驗公式來規劃。
- index.max_result_window
索引能夠查詢到最大資料量,from+size深分頁的最大條數,預設是10000,适當限制這個值可以防止深分頁記憶體占用過多,如果全量導出,需要使用Scroll遊标辦法。
- index.store.preload
預設情況下,Elasticsearch完全依靠作業系統檔案系統緩存來緩存I / O操作.可以設定index.store.preload,以告知作業系統在打開時将熱索引檔案的内容加載到記憶體中。預設值為空,即不提前加載索引到記憶體中,常見的值有["nvd", "dvd", "tim", "doc", "dim"]。對應的norms, doc values, terms dictionaries, postings lists, points,常見的設定為 index.store.preload = ["nvd", "dvd"],即提前加載norms評分資訊和doc value資料到記憶體,便于快速索引。
- index.sort.field 和 index.sort.order
建立索引的排序字段,寫入的時候就按照順序寫入。對于一些具備順序的字段,可以提前設定,比如時間字段。配置見下
{ "settings" : { "index" : { "sort.field" : "date", // 字段名字 "sort.order" : "desc" // 升序 asc 和降序 desc } }}
Mapping設定
-
動态映射
mapping的通用配置,dynamic_templates配置動态類型轉換,将一個類型轉換為另一個類型
{ "mappings": { "_doc": { "dynamic_templates": [ { "strings_as_keywords": { "match_mapping_type": "string", "mapping": { "type": "keyword" } } } ], "_source": { "enabled": true }, "properties": { ..... } } }}
-
字段類型
官方文檔:https://www.elastic.co/guide/en/elasticsearch/reference/6.8/mapping.html#_field_datatypes
a simple type like
text
,
keyword
,
date
,
long
,
double
,
boolean
or
ip
.
a type which supports the hierarchical nature of JSON such as
object
or
nested
.
or a specialised type like
geo_point
,
geo_shape
, or
completion
.
-
常見的類型和搜尋類型的聯系
(1)text 類型作用:分詞,将大段的文字根據分詞器切分成獨立的詞或者詞組,以便全文檢索。
适用于:email 内容、某産品的描述等需要分詞全文檢索的字段;
不适用:排序或聚合(Significant Terms 聚合例外)
(2)keyword 類型:無需分詞、整段完整精确比對。
适用于:email 位址、住址、狀态碼、分類 tags。
-
常見的搜尋類型使用的字段類型
term 精确比對
核心功能:不受到分詞器的影響,屬于完整的精确比對。
應用場景:精确、精準比對。
适用類型:keyword。
prefix 字首比對
核心功能:字首比對。
應用場景:字首自動補全的業務場景。
适用類型:keyword。
wildcard 模糊比對
核心功能:比對具有比對通配符表達式 keyword 類型的文檔。支援的通配符:*,它比對任何字元序列(包括空字元序列);?,它比對任何單個字元。
應用 場景:請注意,選型務必要慎重!此查詢可能很慢多組關鍵次的情況下可能會導緻當機,因為它需要周遊多個術語。為了防止非常慢的通配符查詢,通配符 不能以任何一個通配符*或?開頭。
适用類型:keyword。
match 分詞比對
核心功能:全文檢索,分詞詞項比對。
應用場景:實際業務中較少使用,原因:比對範圍太寬泛,不夠準确。
适用類型:text。
match_phrase 短語比對
核心功能:match_phrase 查詢首先将查詢字元串解析成一個詞項清單,然後對這些詞項進行搜尋; 隻保留那些包含 全部 搜尋詞項,且 位置"position" 與搜尋詞 項相同的文檔。
應用場景:業務開發中 90%+ 的全文檢索都會使用 match_phrase 或者 query_string 類型,而不是 match。
适用類型:text。
multi_match 多組比對
核心功能:match query 針對多字段的更新版本。
應用場景:多字段檢索。
适用類型:text。
query_string 類型
核心功能:支援與或非表達式+其他N多配置參數。
應用場景:業務系統需要支援自定義表達式檢索。
适用類型:text。
bool 組合比對
核心功能:多條件組合綜合查詢。
應用場景:支援多條件組合查詢的場景。
适用類型:text 或者 keyword。一個 bool 過濾器由三部分組成:
must ——所有的語句都 必須(must) 比對,與 AND 等價。
must_not ——所有的語句都 不能(must not) 比對,與 NOT 等價。
should ——至少有一個語句要比對,與 OR 等價。
filter——必須比對,運作在非評分&過濾模式。
range範圍搜尋類型
适用類型:long,integer,double或者 date
-
Mapping 字段的參數設定

(1)index,反向索引,not_analyzed,注意是否分詞,盡量精簡schema字段個數,不會被檢索的字段就不要建立倒排。.field("index", "no")
(2)doc values,正排索引,用于聚合或者排序
(3)norms,analyzed norms存儲了多種正則化算子,用于docs的排序評分,如果不需要排序,可以disable norms
(4)index_options,有docs(文檔有無), freqs(重複出現的文檔評分更高), positions(涵蓋了前2種,并且多了位置資訊,用于臨近查詢), offsets(全部,用于高亮)四類
-
ES 索引template模闆參考例子
-
PUT _template/test_template{ "index_patterns": [ "test_index_*", "test_*" ], "settings": { "number_of_shards": 1, "number_of_replicas": 1, "max_result_window": 100000, "refresh_interval": "30s" }, "mappings": { "properties": { "id": { "type": "long" }, "title": { "type": "keyword" }, "content": { "analyzer": "ik_max_word", "type": "text", "fields": { "keyword": { "ignore_above": 256, "type": "keyword" } } }, "available": { "type": "boolean" }, "review": { "type": "nested", "properties": { "nickname": { "type": "text" }, "text": { "type": "text" }, "stars": { "type": "integer" } } }, "publish_time": { "type": "date", "format": "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" }, "expected_attendees": { "type": "integer_range" }, "ip_addr": { "type": "ip" }, "suggest": { "type": "completion" } } }}