为什么即使在弹性搜索中将dynamic设置为strict也要添加dynamic字段



我已经将dynamic属性设置为"严格的";为我的田地。但是当我使用POST更新api进行更新时,会添加一个动态字段。

映射如下:

{
"dynamic": "strict",
"properties": {
"title": {
"type": "keyword"
},
"track": {
"properties": {
"date": {
"type": "date"
}
}
}
}
}

POST更新查询:

{
"doc": {
"track.date": "2004-08-14"
}
}

结果:

{
"title": "some-title",
"track": {
"date" : "2020-04-12:00:00:00"
},
"track.date":"2004-08-14"
}

为什么新领域";track.date";创建?POST更新不应该给出错误而不是更新上面的字段吗?

我认为动态映射只会影响新的字段,而不会影响更新。因此,我认为这是预期的行为:track.date是标记映射中存在的有效字段,因此没有崩溃。

编辑:我找不到任何明确阻止文档更新的方法,但可以禁用_source字段,这将作为副作用禁用文档更新。不过,在这样做之前,请先阅读文档。

编辑2:我在论坛上创建了一个新的主题来确认这是一个bug。

弹性搜索似乎考虑了"field1.field2": "12"

"field1": {
"field2": "12"
}

以具有完全相同的映射。查询:

PUT /test2
{
"mappings": {
"dynamic": "strict",
"properties": {
"field1.field2": {"type": "text"}
}
}
}

创建具有以下映射的标记(通过GET /test2/_mappings查询(:

{
"test2": {
"mappings": {
"dynamic": "strict",
"properties": {
"field1": {
"properties": {
"field2": {
"type": "text"
}}}}}}} // collapsed

但是更新(和/或(索引文档对这两种语法的处理方式不同:

POST /test2/_doc/0
{
"doc": {
"field1": {
"field2": "0"
}}}

收益率(通过GET test2/_search查询(:"field1": {"field2":"0"}

POST /test2/_doc/0
{
"doc": {
"field1.field2": "1"
}}

产生"field1.field2": "1"

最新更新