问题 仅对elasticsearch上的特定索引禁用动态映射创建?


我正在尝试仅针对特定索引禁用动态映射创建,而不是针对所有索引。出于某种原因,我不能放 默认 用'dynamic'映射:'false'。 所以,我可以看到两个选项:

  1. 指定属性 'index.mapper.dynamic' 在文件中 elasticsearch.yml
  2. 'index.mapper.dynamic' 在索引创建时,如此处所述 https://www.elastic.co/guide/en/kibana/current/setup.html#kibana-dynamic-mapping

第一个选项可能只接受值:true,false和strict。因此,无法指定特定索引的子集(就像我们通过带有属性的模式一样) 'action.auto_create_index'  https://www.elastic.co/guide/en/elasticsearch/reference/current/docs-index_.html#index-creation)。

第二个选项不起作用。 我创建了索引

POST http://localhost:9200/test_idx/
{
    "settings" : {
        "mapper" : {
            "dynamic" : false
        }
    },
    "mappings" : {
        "test_type" : {
            "properties" : {
                "field1" : {
                    "type" : "string"
                }
            }
        }
    }
}

然后检查索引设置:

GET http://localhost:9200/test_idx/_settings    
{
    "test_idx" : {
        "settings" : {
            "index" : {
                "mapper" : {
                    "dynamic" : "false"
                },
                "creation_date" : "1445440252221",
                "number_of_shards" : "1",
                "number_of_replicas" : "0",
                "version" : {
                    "created" : "1050299"
                },
                "uuid" : "5QSYSYoORNqCXtdYn51XfA"
            }
        }
    }
}

和映射:

GET http://localhost:9200/test_idx/_mapping
{
    "test_idx" : {
        "mappings" : {
            "test_type" : {
                "properties" : {
                    "field1" : {
                        "type" : "string"
                    }
                }
            }
        }
    }
}

到目前为止这么好,让我们的索引文档与未声明的字段:

POST http://localhost:9200/test_idx/test_type/1
{
    "field1" : "it's ok, field must be in mapping and in source",
    "somefield" : "but this field must be in source only, not in mapping"
}

然后我再次检查了映射:

GET http://localhost:9200/test_idx/_mapping
{
    "test_idx" : {
        "mappings" : {
            "test_type" : {
                "properties" : {
                    "field1" : {
                        "type" : "string"
                    },
                    "somefield" : {
                        "type" : "string"
                    }
                }
            }
        }
    }
}

如您所见,无论索引设置为“dynamic”,都会扩展映射:false。 我也尝试完全按照doc中的描述创建索引

PUT http://localhost:9200/test_idx
{
    "index.mapper.dynamic": false
}

但得到了相同的行为。

也许我错过了什么?

非常感谢提前!


12592
2017-10-21 15:45


起源

对不起,忘了版本,我正在使用弹性1.5.2。 - shaolin
看到答案的最后一个评论,它实际上是答案 - shaolin
"settings.mapper.dynamic": false 禁用自动类型创建 - czerasz


答案:


你几乎就在那里:需要设置值 strict。 正确的用法如下:

PUT /test_idx
{
  "mappings": {
    "test_type": {
      "dynamic":"strict",
      "properties": {
        "field1": {
          "type": "string"
        }
      }
    }
  }
}

并且进一步推动这一点,如果你想禁止创建新类型,不仅仅是该索引中的字段,请使用:

PUT /test_idx
{
  "mappings": {
    "_default_": {
      "dynamic": "strict"
    },
    "test_type": {
      "properties": {
        "field1": {
          "type": "string"
        }
      }
    }
  }
}

没有 _default_ 模板:

PUT /test_idx
{
  "settings": {
    "index.mapper.dynamic": false
  },
  "mappings": {
    "test_type": {
      "dynamic": "strict",
      "properties": {
        "field1": {
          "type": "string"
        }
      }
    }
  }
}

12
2017-10-21 16:07



谢谢你的答案。不幸的是,我必须为整个索引(索引级别)禁用动态映射创建。在您的示例中,仅针对“test_type”类型禁用了它。我不能用'默认'映射为此(正如我在开头所说) - shaolin
该 _default_ 需要使用映射以禁用字段/类型的索引级创建。 - Andrei Stefan
不幸的是我不能放 _default_ 映射。我试图理解如何在不放置任何映射的情况下禁用动态映射创建(从API的角度来看,通过放置其他映射有点棘手来禁用动态映射,恕我直言) - shaolin
是的,有一种方法。看我上次尝试使用 settings 并且, "dynamic": "strict" 用于单一类型的映射。 - Andrei Stefan
不,有两个单独的设置。索引级别1和映射级别1。这来自文档: 通过将index.mapper.dynamic设置为false,可以完全禁用未映射类型的映射的动态创建。通过将类型的dynamic属性设置为strict,可以完全禁用类型中字段的动态创建。 索引级别设置用于创建新映射(对于新类型)。类型级别1用于该特定类型中的字段。 index.mapper.dynamic 不会继承到新类型,因为类型级别设置是不同的。 - Andrei Stefan


你必须知道,下面的部分只是意味着ES无法动态创建一个类型。

"mapper" : {
        "dynamic" : false
    }

您应该像这样配置ES:

PUT http://localhost:9200/test_idx/_mapping/test_type
{
  "dynamic":"strict"
}

然后你不能索引其他没有映射的字段,并得到如下错误:

mapping set to strict, dynamic introduction of [hatae] within [data] is not allowed

如果你想存储数据,但是使字段不能索引,你可以采取如下设置:

PUT http://localhost:9200/test_idx/_mapping/test_type
{
  "dynamic":false
}

希望这些可以帮助人们同样的问题:)。


3
2017-08-12 09:21