В версии 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 и ошибка
Это был объявлено критическое изменение.
Альтернативой может быть использование принимающий узел с преобразовать процессор для сохранения логического значения этого поля в другое логическое поле:
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
и удалить его, так как вы не можете установить это поле. Вам нужно создать еще одно поле верхнего уровня с именем user_data_boolean
или что-то в этом роде.
Это решение не работает для отображения, которое я дал. Отображение содержит несколько полей. Пример выше для нового поля. В моем случае я попытался установить user_data.logical при ошибке, но это не принимается ES. Он жалуется на установку логического значения для текстового типа (user_data определяется как текст)