#arrays #object #elasticsearch
#массивы #объект #elasticsearch
Вопрос:
Я пытаюсь импортировать объекты JSON в базу данных ElasticSearch. Исправление должно предотвратить следующую ошибку:
"type":"illegal_argument_exception","reason":"mapper [state.config.assertions.target] cannot be changed from type [text] to [long]"},"status":400
Массив объектов, вызывающих проблемы, выглядит следующим образом:
"assertions": [
{
"operator": "lessThan",
"type": "responseTime",
"target": 3000
},
{
"operator": "is",
"type": "statusCode",
"target": 200
},
{
"operator": "is",
"property": "content-type",
"type": "header",
"target": "text/html"
}
]
Сопоставление ожидает тип «long» после двух объектов и выдает ошибку из-за «текста», который он получает с третьим объектом.
Создание объекта «вложенным» вызовет ту же ошибку:
"assertions": {
"type": "nested"
}
Это решение устраняет ошибку, но оно только устраняет проблему, а не предотвращает ее.
"assertions": {
"properties": {
"operator": {
"type": "keyword"
},
"type": {
"type": "keyword"
},
"target": {
"type": "keyword"
}
}
}
Сопоставление должно оставаться включенным для запроса.
Проблема связана с объектами внутри массивов, которые имеют неожиданные типы значений для одних и тех же ключей. Как я могу установить параметры для сопоставления, чтобы принимать другие типы значений, чем ожидалось? Как я могу предотвратить эти ошибки вместо их исправления?
Ответ №1:
Вы не можете предотвратить это с помощью сопоставления elasticsearch, каждое поле в elasticsearch может иметь только один тип данных и выдаст вам исключение, если вы попытаетесь сохранить что-либо, что не соответствует типу данных в сопоставлении, например, тот, который вы получили.
У вас не может быть поля, в котором хранится numeric
значение для одного документа и keyword
значение для другого.
Если у вас есть поле, которое может иметь в качестве значения разные типы данных, такие как числа, логические значения и слова, вам следует сопоставить это поле так keyword
, как вы это делали, если вы не создадите сопоставление для поля перед индексацией, elasticsearch создаст сопоставление при первом получении документа споле и будет использовать это значение для создания сопоставления.
Что вы можете сделать, по крайней мере, для индексации части документа, так это установить для параметра ignore_malformed значение true, таким образом, если у вас есть исключение сопоставления для поля, только это поле будет отклонено, а не весь документ.