在使用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 類型的文檔。支持的通配符:*,它匹配任何字符序列(包括空字符序列);?,它匹配任何單個字符。
應用 場景:請注意,選型務必要慎重!此查詢可能很慢多組關鍵次的情況下可能會導致宕機,因為它需要遍歷多個術語。為了防止非常慢的通配符查詢,通配符 不能以任何一個通配符*或?開頭。
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 等價。 f
ilter——必須匹配,運行在非評分&過濾模式。
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"
}
}
}
}