Документ с несколькими полями логического типа завершается ошибкой при создании

В версии 5.5 у нас было следующее сопоставление, которое работало нормально.

PUT multiple_datatypes
{
  "mappings": {
    "_doc": {
      "properties": {
        "user_data": {
          "type": "text",
          "fields": {
            "numeric": {
              "type": "double",
              "ignore_malformed": true
            },
            "date": {
              "type": "date",
              "ignore_malformed": true
            }
            "logical": {
              "type": "boolean",
             }
          }
        }
      }
    }
  }

В 6.2 тот же маппинг вылетает с ошибкой
HTTP/1.1 400 Bad Request]\n{\"error\":{\"root_cause\":[{\"type\":\"mapper_parsing_exception\",\"причина\":\"не удалось проанализировать [user_data .logical]\"}],\"type\":\"mapper_parsing_exception\",\"причина\":\"не удалось проанализировать [user_data.logical]\",\"caused_by\":{\"type\ ":\"illegal_argument_exception\",\"причина\":\"Не удалось проанализировать значение [auto_directorUrl], так как разрешены только [true] или [false]

Входные данные представляли собой строку "auto_directorURL", и это не удалось. Флаг ignore_malformed недоступен для логических типов. Однако это работало в v5.5. Я обнаружил, что в версии 6.2 ES строго соблюдает значения логического типа как «истина» или «ложь». но это не работает в нескольких полях, поскольку у него нет флага ignore_malformed. какое решение для этого? Это перерыв BWC и ошибка

0
0
243
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Это был объявлено критическое изменение.

Альтернативой может быть использование принимающий узел с преобразовать процессор для сохранения логического значения этого поля в другое логическое поле:

PUT _ingest/pipeline/boolean-pipeline
{
  "description": "converts the content of the field to a boolean value",
  "processors" : [
    {
      "convert" : {
        "field" : "user_data",
        "target_field" : "user_data_boolean",
        "type": "boolean",
        "on_failure" : [
          {
            "set" : {
              "field" : "user_data_boolean",
              "value" : false
            }
          }
        ]
      }
    }
  ]
}

Затем вы можете индексировать данные, используя этот конвейер.

PUT test/doc/1?pipeline=boolean-pipeline
{
  "user_data": "true"
}

PUT test/doc/2?pipeline=boolean-pipeline
{
  "user_data": "auto_directorURL"
}

В результате вы получите следующие проиндексированные данные, чего и следовало ожидать:

"hits" : [
  {
    "_index" : "test",
    "_type" : "doc",
    "_id" : "2",
    "_score" : 1.0,
    "_source" : {
      "user_data" : "auto_directorURL",
      "user_data_boolean" : false
    }
  },
  {
    "_index" : "test",
    "_type" : "doc",
    "_id" : "1",
    "_score" : 1.0,
    "_source" : {
      "user_data" : "true",
      "user_data_boolean" : true
    }
  }
]

Это решение не работает для отображения, которое я дал. Отображение содержит несколько полей. Пример выше для нового поля. В моем случае я попытался установить user_data.logical при ошибке, но это не принимается ES. Он жалуется на установку логического значения для текстового типа (user_data определяется как текст)

Dhopu K 10.04.2019 16:01

Вам нужно забыть о user_data.logical и удалить его, так как вы не можете установить это поле. Вам нужно создать еще одно поле верхнего уровня с именем user_data_boolean или что-то в этом роде.

Val 10.04.2019 16:03

Другие вопросы по теме