#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 я соответствующим образом обновил свой ответ. К сожалению, это стало довольно важным ответом, если вы видите, как можно улучшить форматирование, пожалуйста, расскажите мне об этом.