背景: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": { } } } }