• mapping 详解5(dynamic mapping)


    概述

    在使用 ES 的时,我们不需要事先定义好映射设置就可以直接向索引中导入文档。ES 可以自动实现每个字段的类型检测,并进行 mapping 设置,这个过程就叫动态映射(dynamic mapping)。

    动态映射可以通过以下设置来关闭。

    PUT /_settings 
    {
      "index.mapper.dynamic":false
    }

    动态映射的规则也可以自定义,有以下几种我们可以自定义规则的应用场景:

    1. 默认映射(_default_ mapping)
    2. 字段动态映射(dynamic field mapping)
    3. 动态模板(dynamic template)
    4. 索引模板(index template)

    其中,前 3 个条件中都是针对特定 index 下的 type 进行设置,而条件 4 是针对所有满足条件的 index 进行设置。

    默认映射

    默认映射通过把 mapping type 设置为 _default_ 来定义。

    默认映射将会应用到该 index 下的任意新增 type 中。

    默认映射可以在添加 index 时候设置,也可以创建 index 之后再通过 PUT mapping 接口进行设置。

    PUT my_index
    {
      "mappings": {
        "_default_": { 
          "_all": {
            "enabled": false         //默认映射禁用掉所有新增 type 的 _all 元数据字段
          }
        },
        "user": {}, 
        "blogpost": { 
          "_all": {
            "enabled": true     //覆盖 _default_ 的设置,启用 _all 字段
          }
        }
      }
    }

    字段动态映射

    默认情况,发现新的字段,ES 自动检测其 datatype 并将其加入到 mapping type 中。

    通过一些设置,我们可以控制字段动态映射的方式,包括:日期类型检测、数值类型检测、自定义日期类型的格式等。

    PUT my_index         //禁用日期类型检测
    {
      "mappings": {
        "my_type": {
          "date_detection": false
        }
      }
    }
    PUT my_index       //自定义日期类型的格式
    {
      "mappings": {
        "my_type": {
          "dynamic_date_formats": ["MM/dd/yyyy"]
        }
      }
    }
    PUT my_index        //启用数值类型检测
    {
      "mappings": {
        "my_type": {
          "numeric_detection": true
        }
      }
    }

    动态模板

    动态模板将会根据条件判断,应用到满足条件的新增字段上去。

    应用条件包括:

    1. 用 match_mapping_type 来检测新增字段的数据类型是否满足某种条件
    2. 用 match、unmatch 和 match_pattern 来判断新增字段的字段名是否满足某种条件
    3. 用 path_match 和 path_unmatch 来判断新增字段的完整路径是否匹配某条件

    动态模板以数组的形式给出,数组的每一个元素就是一个模板。每个模板都有各自的应用条件,一旦新增的字段满足某个模板,模板内容就会应用到该字段上。

    有两个特殊的变量,在模板中可以运用:{name}、{dynamic_type}。前者表示原字段的字段名,后者标识原字段被 ES 自动识别出来的数据类型。

    "dynamic_templates": [                 //数组,每个元素都是一个动态模板
        {
          "my_template_name": {            //动态模板名称
            ...  match conditions ...      //应用条件判断
            "mapping": { ... }             //映射设置
          }
        },
        ...                                //多个数组元素标识多个动态模板
      ]
    PUT my_index
    {
      "mappings": {
        "my_type": {
          "dynamic_templates": [
            {
              "named_analyzers": {
                "match_mapping_type": "string",
                "match": "*",
                "mapping": {
                  "type": "string",
                  "analyzer": "{name}"
                }
              }
            },
            {
              "no_doc_values": {
                "match_mapping_type":"*",
                "mapping": {
                  "type": "{dynamic_type}",
                  "doc_values": false
                }
              }
            }
          ]
        }
      }
    }
    动态模板示例

    索引模板

    索引模板根据条件来判断新建的索引(只应用到新建索引上)是否满足某条件,并对其进行映射设置。

    索引模板包含一些对索引的设置和映射设置。

    在索引模板中有一个特殊变量可以运用:{index}。表示匹配上条件的原索引名称。

    PUT /_template/template_1
    {
      "template": "te*",                          //判断条件,判断哪些索引将应用该模板
      "settings": {                               //索引设置
        "number_of_shards": 1
      },
      "mappings": {                               //映射设置
        "type1": {
          "_source": {
            "enabled": false
          },
          "properties": {
            "host_name": {
              "type": "string",
              "index": "not_analyzed"
            },
            "created_at": {
              "type": "date",
              "format": "EEE MMM dd HH:mm:ss Z YYYY"
            }
          }
        }
      }
    }
  • 相关阅读:
    shell命令--stat
    英文段子
    OCP读书笔记(16)
    shell命令--uptime
    OCP读书笔记(15)
    shell命令--dmesg
    OCP读书笔记(14)
    shell命令--hostname
    OCP读书笔记(13)
    shell命令--uname
  • 原文地址:https://www.cnblogs.com/licongyu/p/5497298.html
Copyright © 2020-2023  润新知