在使用ES時,我們常見的就是需要生成一個template來定義索引的設(shè)置,分詞器,MApping.本文將基于項目經(jīng)驗來總結(jié)一些常用的配置。
Index設(shè)置
- index.refresh_interval
配置一個刷新時間,將index buffer刷新到os cache的時間間隔,刷新到os cache的數(shù)據(jù)才可以被索引到,默認(rèn)是1s.如果對實時性搜索要求不高的地方,可設(shè)置時間為30s,提高性能。
- number_of_replicas
對于集群數(shù)據(jù)節(jié)點 >=2 的場景,建議副本至少設(shè)置為 1(一主一從,共兩個副本), 可以提高集群容錯和搜索吞吐量(副本分片可用于查詢)。
- index.number_of_shards
主副本的分片數(shù),默認(rèn)是5個,最大值限制為1024個,這個值是分片數(shù)可適當(dāng)?shù)脑黾?,提高索引的并發(fā)性能,但是分片越多,也會導(dǎo)致資源耗費越高,索引要根據(jù)訪問并發(fā)數(shù)和ES集群的資源來設(shè)置。經(jīng)驗公式:分片數(shù) = 索引大小/分片大小經(jīng)驗值 30GB,官方推薦Shard值在 20-40GB性能最好,日志類:單分片<50GB;搜索類:單分片<20GB。不足100G,可直接設(shè)置3-5個分片(結(jié)合節(jié)點數(shù)和擴(kuò)展性),超過100G則可以按照如上經(jīng)驗公式來規(guī)劃。
- index.max_result_window
索引能夠查詢到最大數(shù)據(jù)量,from+size深分頁的最大條數(shù),默認(rèn)是10000,適當(dāng)限制這個值可以防止深分頁內(nèi)存占用過多,如果全量導(dǎo)出,需要使用Scroll游標(biāo)辦法。
- index.store.preload
默認(rèn)情況下,Elasticsearch完全依靠操作系統(tǒng)文件系統(tǒng)緩存來緩存I / O操作.可以設(shè)置index.store.preload,以告知操作系統(tǒng)在打開時將熱索引文件的內(nèi)容加載到內(nèi)存中。默認(rèn)值為空,即不提前加載索引到內(nèi)存中,常見的值有["nvd", "dvd", "tim", "doc", "dim"]。對應(yīng)的norms, doc values, terms dictionaries, postings lists, points,常見的設(shè)置為 index.store.preload = ["nvd", "dvd"],即提前加載norms評分信息和doc value數(shù)據(jù)到內(nèi)存,便于快速索引。
- index.sort.field 和 index.sort.order
建立索引的排序字段,寫入的時候就按照順序?qū)懭搿τ谝恍┚邆漤樞虻淖侄?,可以提前設(shè)置,比如時間字段。配置見下
{
"settings" : {
"index" : {
"sort.field" : "date", // 字段名字
"sort.order" : "desc" // 升序 asc 和降序 desc
}
}
}
Mapping設(shè)置
- 動態(tài)映射
mapping的通用配置,dynamic_templates配置動態(tài)類型轉(zhuǎn)換,將一個類型轉(zhuǎn)換為另一個類型
{
"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.
- 常見的類型和搜索類型的聯(lián)系
(1)text 類型作用:分詞,將大段的文字根據(jù)分詞器切分成獨立的詞或者詞組,以便全文檢索。 適用于:email 內(nèi)容、某產(chǎn)品的描述等需要分詞全文檢索的字段; 不適用:排序或聚合(Significant Terms 聚合例外)
(2)keyword 類型:無需分詞、整段完整精確匹配。 適用于:email 地址、住址、狀態(tài)碼、分類 tags。
- 常見的搜索類型使用的字段類型
term 精確匹配
核心功能:不受到分詞器的影響,屬于完整的精確匹配。
應(yīng)用場景:精確、精準(zhǔn)匹配。
適用類型:keyword。
prefix 前綴匹配
核心功能:前綴匹配。
應(yīng)用場景:前綴自動補(bǔ)全的業(yè)務(wù)場景。
適用類型:keyword。
wildcard 模糊匹配
核心功能:匹配具有匹配通配符表達(dá)式 keyword 類型的文檔。支持的通配符:*,它匹配任何字符序列(包括空字符序列);?,它匹配任何單個字符。
應(yīng)用 場景:請注意,選型務(wù)必要慎重!此查詢可能很慢多組關(guān)鍵次的情況下可能會導(dǎo)致宕機(jī),因為它需要遍歷多個術(shù)語。為了防止非常慢的通配符查詢,通配符 不能以任何一個通配符*或?開頭。
match 分詞匹配
核心功能:全文檢索,分詞詞項匹配。
應(yīng)用場景:實際業(yè)務(wù)中較少使用,原因:匹配范圍太寬泛,不夠準(zhǔn)確。
適用類型:text。
match_phrase 短語匹配
核心功能:match_phrase 查詢首先將查詢字符串解析成一個詞項列表,然后對這些詞項進(jìn)行搜索; 只保留那些包含 全部 搜索詞項,且 位置"position" 與搜索詞 項相同的文檔。
應(yīng)用場景:業(yè)務(wù)開發(fā)中 90%+ 的全文檢索都會使用 match_phrase 或者 query_string 類型,而不是 match。
適用類型:text。
multi_match 多組匹配
核心功能:match query 針對多字段的升級版本。
應(yīng)用場景:多字段檢索。
適用類型:text。
query_string 類型
核心功能:支持與或非表達(dá)式+其他N多配置參數(shù)。
應(yīng)用場景:業(yè)務(wù)系統(tǒng)需要支持自定義表達(dá)式檢索。
適用類型:text。
bool 組合匹配
核心功能:多條件組合綜合查詢。
應(yīng)用場景:支持多條件組合查詢的場景。
適用類型:text 或者 keyword。
一個 bool 過濾器由三部分組成:
must ——所有的語句都 必須(must) 匹配,與 AND 等價。
must_not ——所有的語句都 不能(must not) 匹配,與 NOT 等價。
should ——至少有一個語句要匹配,與 OR 等價。 f
ilter——必須匹配,運(yùn)行在非評分&過濾模式。
range范圍搜索類型
適用類型:long,integer,double或者 date
- Mapping 字段的參數(shù)設(shè)置

(1)index,倒排索引,not_analyzed,注意是否分詞,盡量精簡schema字段個數(shù),不會被檢索的字段就不要建立倒排。.field("index", "no")
(2)doc values,正排索引,用于聚合或者排序
(3)norms,analyzed norms存儲了多種正則化算子,用于docs的排序評分,如果不需要排序,可以disable norms
(4)index_options,有docs(文檔有無), freqs(重復(fù)出現(xiàn)的文檔評分更高), 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"
}
}
}
}