ES 十月 12, 2021

mapping

文章字数 5.3k 阅读约需 5 mins. 阅读次数 0

Mapping

​ mapping就是ES数据字段field的type元数据,ES在创建索引的时候,dynamic mapping会自动为不同的数据指定相应mapping,mapping中包含了字段的类型、搜索方式(exact value或者full text)、分词器等。

查看mapping

  1. 在dev tools中命令查询

    GET user/_mapping

  2. 在索引管理界面中查看

    stack management ->index mamagement ->(select table) ->mappings

    mapping位置

ES 数据类型

  1. 常见数据类型

    1. 数字类型

      long integer short byte double float half_float scaled_fload unsigned_long

    2. keywords

      适用于索引结构化字段,可以用于过滤排序聚合,只能通过精确值(exact value)搜索到.eg:id

      constant_keyword:始终包含相同值的关键字字段.

      wildcard:可以针对类似grep的通配符查询优化日志行和类似的关键字值.

    3. Dates: 包含date与date_nanos. es内部存储时间使用毫米.若还需要精确,用nanos来精确到纳秒.

    4. alias: 为现有字段定义别名

    5. binary: 二进制数据

    6. range: 区间类型, integer_range, float_range, long_range, double_range, date_range.

    7. text: 默认生成倒排索引,不生成正排索引.

      对于需要全文搜索的字段,其内容需要被解析, 在生成倒排索引前,字符串会被分析器分成一个一个词项.

      text类型不用于排序,很少用于聚合. 因为加载text字段需要大量堆空间用于正排索引,资源消耗过大,可能出现延迟等问题.

  2. 对象关系类型

    1. object: 用于单个json对象
    2. nested: 用于json对象数组
    3. flattened: 允许将整个json对象索引为单个字段.
  3. 结构化类型

    geo-point: 经纬度

    geo-shape: 多边形

    point: 坐标点

    shape: 笛卡尔多边形

  4. 特殊类型

    ip地址: 用于ipv4,ipv6

    completion: 提供自动完成建议

    tocken_count: 计算字符串中令牌数量

    murmur3: 在索引时计算值的哈希并存于索引中.

    annotared-text: 索引包含特殊标记的文本.

    percolator:

    join: 为同一索引内的文档提供父子关系.

  5. array: 无需专用的字段数据类型,任意字段都可以包含零个或者多个值.只要满足数据的结构一致即可.

两种映射类型

dynamic field mapping:

  • 整形 -> long

  • 浮点型 -> float

  • true/false -> boolean

  • 日期 -> date

  • 数组 -> 取决于数字中的第一个有效值

  • 对象 -> object

  • 字符串 -> 映射成text和keyword两个类型

    除了以上类型外,其他数据类型需要显示映射.

expllcit field mapping 手动映射

put /[table]
{
  "mappings": {
    "properties": {
      "[field]" :{
        "[mapping_parameter]": "[mapping_vales]"
      }
    }
  }
}
# eg:  设置描述字段类型
PUT /mapping_1
{
  "mappings": {
    "properties": {
      "描述" :{ // 字段名称
        "type": "text", // 字段类型
        "analyzer": "standard", // 分词器选择
        "fields": { 
          "keyword":{ 
            "type":"keyword",
            "ignore_above":255
          }
        }
      }
    }
  }
}

映射参数

  • index: 是否创建倒排索引,若不创建,该字段不会通过索引被搜索到.元数据中任然存在.

  • analyzer: 指定分析器(character filter,tokenizer,token filters).

  • boost: 当前字段相关度的评分权重,默认1. 在联合搜索时,计算出相关度的先后位置.

  • coerce: 是否允许强制类型转换. 可以自动转换字符串数字为数字.

  • copy_to: 允许将多个字段的值复制到数字字段中.然后作为单个字段进行查询.

  • doc_values: 正排索引开关.可以提升排序与聚合效率.若不需要对字段进行排序聚合与访问,可以禁用doc值来节省磁盘空间.不支持text类型的字段.

  • dynamic: 是否可以动态添加新字段.默认true

    true: 检测到的新字段将自动添加到映射中.

    false: 检测到的新字段不会存在mapping中.但数据还是会保存.只是没有索引,无法搜索该字段.需要在mapping中显示添加新字段.

    strict: 如果检测到新字段.将抛出异常并拒绝文档.需要提前显示添加新字段.

  • eager_global_ordinals: 用于聚合的字段上,优化聚合性能.

  • enable: 是否创建倒排索引.可以对单字段设置,也可以对全局设置.该状态一旦设置无法修改.

  • fielddate: 在索引关闭的情况下,因业务变更需要重新使用索引,可设置此参数.在jvm中动态的添加索引,用于排序或聚合.

  • fields: 给field创建多个字段, 用于不同目的.eg:text添加keyword.达到搜索目的.

  • ignore_above: 超过长度将忽略.

  • ignore_malformed: 类型错误忽略.

  • index_options:

  • index_prefixes: 前缀索引

  • mate: 附加元数据

  • normalizer:

  • norms: 是否禁用评分.

  • null_value: 为null时设置的默认值

  • search_analyzer: 设置单独的查询时分析器

  • similarity: 相关度算法设置

  • store: 设置字段是否仅查询.

  • term_vector:运维参数

更新mapping语句


GET ip_address/_mapping

PUT ip_address/_mapping/_doc
{
  "properties":{
       "ip" : {
            "type" : "keyword"
       },
       "province": {
          "type" : "keyword"
       },
       "city": {
          "type" : "keyword"
       }
  }
}

0%