背景:es6
因爲本人使用的是6.0以上的版本es,在使用發現不少中文博客對於mapping參數的說明已過期。ES6.0之後有不少參數變化。app
現我根據官網總結mapping最新的參數,但願能對你們有用處。性能
es6.0與以前版本區別:大數據
-新增字段: eager_global_ordinalsspa
-刪除的字段: include_in_allcode
※特別提示:orm
1,建議你們建立索引的時候指定mapping(用到特定分詞器,規劃字段是否被索引來節省空間等)blog
2,mapping建立並插入數據後就沒法進行更改了!因此要對需求考慮全面:例如對於text類型字段須要聚合查詢(相似group by)對數據進行統計分析,排序
就須要設置fielddata爲true 和fields字段才能進行聚合操做(此處詳解請看下面的內容2)索引
3,若是必須更改字段屬性只能進行reindex,進行從新創建索引再將doc導入
1,es 6.2 mapping詳細說明
{ "type" : "text", #是數據類型通常文本使用text(可分詞進行模糊查詢);keyword沒法被分詞(不須要執行分詞器),用於精確查找 "analyzer" : "ik_max_word", #指定分詞器,通常使用最大分詞:ik_max_word "normalizer" : "normalizer_name", #字段標準化規則;如把全部字符轉爲小寫;具體以下舉例 "boost" : 1.5, #字段權重;用於查詢時評分,關鍵字段的權重就會高一些,默認都是1;另外查詢時可臨時指定權重 "coerce" : true, #清理髒數據:1,字符串會被強制轉換爲整數 2,浮點數被強制轉換爲整數;默認爲true "copy_to" : "field_name", #自定_all字段;指定某幾個字段拼接成自定義;具體以下舉例 "doc_values" : true, #加快排序、聚合操做,但須要額外存儲空間;默認true,對於肯定不須要排序和聚合的字段可false "dynamic" : true, #新字段動態添加 true:無限制 false:數據可寫入但該字段不保留 'strict':沒法寫入拋異常 "enabled" : true, #是否會被索引,但都會存儲;能夠針對一整個_doc "fielddata" : false, #針對text字段加快排序和聚合(doc_values對text無效);此項官網建議不開啓,很是消耗內存 "eager_global_ordinals": true, #是否開啓全局預加載,加快查詢;此參數只支持text和keyword,keyword默承認用,而text須要設置fielddata屬性 "format" : "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd||epoch_millis" ,#格式化 此參數表明可接受的時間格式 3種都接受 "ignore_above" : 100, #指定字段索引和存儲的長度最大值,超過最大值的會被忽略 "ignore_malformed" : false ,#插入文檔時是否忽略類型 默認是false 類型不一致沒法插入 "index_options" : "docs" , # 4個可選參數 # docs(索引文檔號), # freqs(文檔號 + 詞頻), # positions(文檔號 + 詞頻 + 位置,一般用來距離查詢), # offsets(文檔號 + 詞頻 + 位置 + 偏移量,一般被使用在高亮字段) # 分詞字段默認是position,其餘的默認是docs "index" : true, #該字段是否會被索引和可查詢 默認true "fields": {"raw": {"type": "keyword"}} ,#能夠對一個字段提供多種索引模式,使用text類型作全文檢索,也可以使用keyword類型作聚合和排序 "norms" : true, #用於標準化文檔,以便查詢時計算文檔的相關性。建議不開啓 "null_value" : "NULL", #可讓值爲null的字段顯式的可索引、可搜索 "position_increment_gap" : 0 ,#詞組查詢時能夠跨詞查詢 既可變爲分詞查詢 默認100 "properties" : {}, #嵌套屬性,例如該字段是音樂,音樂還有歌詞,類型,歌手等屬性 "search_analyzer" : "ik_max_word" ,#查詢分詞器;通常狀況和analyzer對應 "similarity" : "BM25",#用於指定文檔評分模型,參數有三個: # BM25 :ES和Lucene默認的評分模型 # classic :TF/IDF評分 # boolean:布爾模型評分 "store" : true, #默認狀況false,其實並非真沒有存儲,_source字段裏會保存一份原始文檔。 # 在某些狀況下,store參數有意義,好比一個文檔裏面有title、date和超大的content字段,若是隻想獲取title和date "term_vector" : "no" #默認不存儲向量信息, # 支持參數yes(term存儲), # with_positions(term + 位置), # with_offsets(term + 偏移量), # with_positions_offsets(term + 位置 + 偏移量) # 對快速高亮fast vector highlighter能提高性能,但開啓又會加大索引體積,不適合大數據量用 } normalizer舉例: { "settings": { "analysis": { "normalizer": { "my_normalizer": { "type": "custom", "char_filter": [], "filter": ["lowercase", "asciifolding"] } } } }, "mappings": { "type": { "properties": { "foo": { "type": "keyword", "normalizer": "my_normalizer" } } } } } copy_to舉例: { "mappings": { "my_type": { "properties": { "first_name": { "type": "text", "copy_to": "full_name" }, "last_name": { "type": "text", "copy_to": "full_name" }, "full_name": { "type": "text" } } } } }
2,text類型字段進行聚合查詢(count(*) group by)
需求:對機構字段既能夠進行模糊查詢,又能夠按照字段全名進行聚合統計
實現:
-設置字段參數
"institution": { "type": "text", "analyzer": "ik_max_word", "search_analyzer": "ik_max_word", "fielddata" : true, "fields": {"raw": {"type": "keyword"}}#若是不設置keyword索引在聚合時將會使用已分解後的詞。例如:想用「國泰君安」聚合,結果使用「國泰」,「君安」聚合 }
-查詢時aggs參數
body = { "query": { "range": { "time": { "gte": '2018-02-01' } } }, "aggs": { "institution_count": { "terms": {"field": "institution.raw"},#使用keyword分組 "aggs": { } } } }