• -------------------------------------------------------------
  • ====================================

ElasticSearch 6.2 Mapping参数说明及text类型字段聚合查询配置

elasticsearch dewbay 5年前 (2019-04-12) 2009次浏览 已收录 0个评论 扫描二维码

背景:

  由于本人使用的是 6.0 以上的版本 es,在使用发现很多中文博客对于 mapping 参数的说明已过时。ES6.0 以后有很多参数变化。

  现我根据官网总结 mapping 最新的参数,希望能对大家有用处。

  es6.0 与之前版本区别:

    -新增字段: eager_global_ordinals

    -删除的字段: include_in_all

  ※特别提示:

    1,建议大家创建索引的时候指定 mapping(用到特定分词器,规划字段是否被索引来节省空间等)

    2,mapping 创建并插入数据后就无法进行更改了!所以要对需求考虑全面:例如对于 text 类型字段需要聚合查询(类似 group by)对数据进行统计分析,

             就需要设置 fielddata 为 true 和 fields 字段才能进行聚合操作(此处详解请看下面的内容 2)

    3,如果必须更改字段属性只能进行 reindex,进行重新建立索引再将 doc 导入

1,es 6.2 mapping 详细说明

ElasticSearch 6.2 Mapping参数说明及text类型字段聚合查询配置
{
   "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"
        }
      }
    }
  }
}
ElasticSearch 6.2 Mapping参数说明及text类型字段聚合查询配置

 2,text 类型字段进行聚合查询(count(*) group by)

需求:对机构字段既可以进行模糊查询,又可以按照字段全名进行聚合统计

实现:

-设置字段参数

ElasticSearch 6.2 Mapping参数说明及text类型字段聚合查询配置
 "institution": {
              "type": "text",
              "analyzer": "ik_max_word",
              "search_analyzer": "ik_max_word",
              "fielddata" : true,
              "fields": {"raw": {"type": "keyword"}}#如果不设置 keyword 索引在聚合时将会使用已分解后的词。例如:想用“国泰君安”聚合,结果使用“国泰”,“君安”聚合
}              
ElasticSearch 6.2 Mapping参数说明及text类型字段聚合查询配置

-查询时 aggs 参数

ElasticSearch 6.2 Mapping参数说明及text类型字段聚合查询配置
    body = {
            "query": {
                "range": {
                        "time": {
                                "gte": '2018-02-01'
                                }
                        }
                    },
            "aggs": {
                "institution_count": {
                    "terms": {"field": "institution.raw"},#使用 keyword 分组
                    "aggs": {
                    }
    
                }
    
            }
            }

露水湾 , 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权
转载请注明原文链接:ElasticSearch 6.2 Mapping参数说明及text类型字段聚合查询配置
喜欢 (0)
[]
分享 (0)
关于作者:
发表我的评论
取消评论

表情 贴图 加粗 删除线 居中 斜体 签到

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址