我已经将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"