документ с несколькими полями логического типа не работает во время создания - PullRequest
0 голосов
/ 08 апреля 2019

В v5.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 неверный запрос] \ n {\ "error \": {\ "root_cause \": [{\ "type \": \ "mapper_parsing_exception \", \ "reason \": \ "не удалось проанализировать [user_data] .logical] \ "}], \" type \ ": \" mapper_parsing_exception \ ", \" reason \ ": \" не удалось проанализировать [user_data.logical] \ ", \" reason_by \ ": {\" type \ ": \" invalid_argument_exception \ ", \" reason \ ": \" Не удалось проанализировать значение [auto_directorUrl], поскольку разрешены только [true] или [false]

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

1 Ответ

1 голос
/ 08 апреля 2019

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

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

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
    }
  }
]
...