Почему динамическое поле добавляется, даже если для параметра dynamic установлено значение strict в elasticsearch?

#elasticsearch

#elasticsearch

Вопрос:

Я установил для динамического свойства значение «strict» для своих полей. Но когда я обновляю с помощью POST _update api, добавляется динамическое поле.

Сопоставление выглядит следующим образом:

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

Запрос POST _update :

 {
    "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 update не должен выдавать ошибку вместо обновления указанного выше поля?

Комментарии:

1. Можете ли вы указать точные шаги, которые вы делаете? Я подозреваю, что там чего-то не хватает.

2. Я создал индекс с заданным отображением, вставил данные и обновил запись, используя данный api обновления.

Ответ №1:

Я считаю, что динамическое сопоставление влияет только на новые поля, а не на обновления. Итак, я бы сказал, что это ожидаемое поведение: track.date присутствует ли допустимое поле в сопоставлении индекса, поэтому ничего не происходит сбоя.

Редактировать: я не смог найти никакого способа явно запретить обновления документа, но вы можете отключить _source поле, что в качестве побочного эффекта приведет к отключению обновлений документа. Пожалуйста, прочитайте документы, прежде чем делать это.

Редактировать 2: я создал новую тему на форумах, чтобы подтвердить, что это ошибка.

Кажется, что elasticsearch учитывает "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"

Комментарии:

1. Я имел в виду, что было создано новое поле «track.date». Это должно произойти? Я отредактировал вопрос.

2. @RAJEESHPM я соответствующим образом обновил свой ответ. К сожалению, это стало довольно важным ответом, если вы видите, как можно улучшить форматирование, пожалуйста, расскажите мне об этом.