在Elasticsearch中完全禁用动态映射 [英] Disable dynamic mapping completely in Elasticsearch

查看:76
本文介绍了在Elasticsearch中完全禁用动态映射的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有一个索引模板,可以从中创建索引

I have an index template, from which I am creating an index

PUT /_index_template/example_template
{
   "index_patterns": [
        "example*"
    ],
    "priority": 1,
    "template": {
        "aliases": {
            "example":{}
        },
    "mappings": {
"dynamic":strict,
      "_source":
      {"enabled": false},
      "properties": {
       "SomeID":
        { "type": "keyword", "index" : true,"store":true,"ignore_above":5},
       "firstName":
        { "type": "text", "index" : true,"store":true},
        "lastName":
        { "type": "text", "index" : false},
        "PersonInfo": {
        "type": "object",
"dynamic":"true",
        "properties": {
          "FirstName": {
            "type": "keyword",
            "index": true,
            "store": false
          }
        }
        }
      }
    },
    "settings": {
    "index": {
      "number_of_shards": 1,  
      "number_of_replicas": 3
    }
  }
  }
}

在模板映射中,您可以看到我将动态设置为严格",因此无法将新字段添加到映射中,在内部对象PersonInfo上,我可以将dynamic设置为true,这是优先的,并允许插入新的字段映射.

As in the template mappings you can see I am making the dynamic as Strict, so that new fields cant be added to the mappings, while on inner object, PersonInfo, I can set dynamic as true, which takes precedence and allow to insert a new field mapping.

PUT example10022021/_doc/1
{
   "SomeID":"1234",
   "firstName":"Nishikant",
   "PersonInfo.service_data":"random"
}

在这里,由于动态性为真,因此service_data已添加到映射中

Here service_data is getting added into mappings, as dynamic is true

"PersonInfo" : {
          "dynamic" : "true",
          "properties" : {
            "FirstName" : {
              "type" : "keyword"
            },
            "service_data" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }

有什么办法可以完全禁用动态映射?喜欢全局指定?

Is there any way to disable the dynamic mapping completely? like specifying globally?

谢谢!

在@Val回答后我采取的步骤:

Steps I took After @Val answer:

PUT /_index_template/example_template
{
   "index_patterns": [
        "example*"
    ],
    "priority": 1,
    "template": {
        "aliases": {
            "order":{}
        },
    "mappings": {
      "dynamic": "strict",
      "dynamic_templates": [
        {
          "objects": {
            "match_mapping_type": "object",
            "mapping": {
              "dynamic": "strict"
            }
          }
        }
      ],
      "_source":
      {"enabled": false},
      "properties": {
       "BillToID":
        { "type": "keyword", "index" : true,"store":true,"ignore_above":5},
       "firstName":
        { "type": "text", "index" : true,"store":true},
        "lastName":
        { "type": "text", "index" : false},
        "PersonInfo": {
        "type": "object",
        "dynamic":true,
        "properties": {
          "FirstName": {
            "type": "keyword",
            "index": true,
            "store": false
          }
        }
        }
      }
    },
    "settings": {
    "index": {
      "number_of_shards": 1,  
      "number_of_replicas": 3
    }
  }
  }
}

然后我创建一个索引

PUT example10022021

然后插入文档

POST example10022021/_doc/1
{
   "BillToID":"1234",
   "firstName":"Nishikant",
   "PersonInfo.service_data":"random"
}

现在,如果您再次检查映射,结果将为200OK

this will result in 200OK, now if you check the mappings again

GET example10022021

在o/p中,您可以看到动态字段映射正在添加(我不希望这种行为),

in o/p you can see the dynamic field mapping getting added(this behavior I don't want),

"PersonInfo" : {
          "dynamic" : "true",
          "properties" : {
            "FirstName" : {
              "type" : "keyword"
            },
            "service_data" : {
              "type" : "text",
              "fields" : {
                "keyword" : {
                  "type" : "keyword",
                  "ignore_above" : 256
                }
              }
            }
          }
        }

推荐答案

您可以做的是创建一个适用于所有索引的索引模板,即使用 * 名称模式:

What you can do is to create another index template that applies to all indexes, i.e. using the * name pattern:

PUT /_index_template/common_template
{
   "index_patterns": [
        "*"
    ],
    "priority": 0,
    "template": {
       "mappings": {
         "dynamic": "strict",
         ...

如果您还希望限制内部对象内部动态字段的创建,则可以利用

If you want to also restrict the creation of dynamic fields inside inner objects, you can leverage dynamic templates, like this:

PUT /_index_template/common_template
{
  "index_patterns": [
    "*"
  ],
  "priority": 1000,
  "template": {
    "settings": {},
    "mappings": {
      "dynamic": "strict",
      "dynamic_templates": [
        {
          "objects": {
            "match_mapping_type": "object",
            "mapping": {
              "dynamic": "strict"
            }
          }
        }
      ],
      "properties": {
        "test": {
          "type": "object",
          "properties": {
            "inner": {
              "type": "integer"
            }
          }
        }
      }
    }
  }
}

使用上面的索引模板,您可以创建一个像这样的文档:

With the above index template, you can create a document like this one:

POST test/_doc/
{
  "test": {
    "inner": 1
  }
}

但不是这样的:

POST test/_doc/
{
  "test": {
    "inner": 1,
    "inner2": 2        <--- this will not be allowed
  }
}

这篇关于在Elasticsearch中完全禁用动态映射的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆