Elasticsearch терпит неудачу, если у документа есть несоответствие отображения для поля
У меня возникла странная проблема с Elasticsearch. My mapping указывает, что определенное поле имеет тип long
. Теперь случайно я пытался индексировать некоторые документы, у которых был тип string
для этого поля вместо long
. Я не получал ошибок от Elasticsearch, но документы никогда не индексировались. Когда я исправил проблему, документы были проиндексированы просто отлично.
Пример:
Мое отображение:
{
"field1": {
"type": "long"
}
}
Когда я отправляю этот документ, он терпит неудачу:
{
"field1": "this is a string"
}
Когда я отправлю это, он работает так, как ожидалось:
{
"field1": 12345
}
Есть ли способ обнаружить такие ошибки?
Ответы
Ответ 1
Если вы установите ignore_malformed строку в false. Он не будет индексировать документ, если он неверен, но генерирует исключение. По крайней мере, в elasticsearch 1.6.0.
Пример:
put test
put test/test/_mapping
{
"properties" : {
"title" : {"type" : "string"},
"data" : {"type": "long" ,"ignore_malformed":false}
}
}
put test/test/1
{
"data" : "1",
"title" : "valid coerce string to number"
}
put test/test/2
{
"data" : "hello",
"title" : "invalid number"
}
#Failed Response
{
"error": "MapperParsingException[failed to parse [data]]; nested: NumberFormatException[For input string: \"hello\"]; ",
"status": 400
}
Query with Get fails
get test/test/2
{
"_index": "test",
"_type": "test",
"_id": "2",
"found": false
}
Ответ 2
Я подозреваю, что ваше сопоставление выглядит примерно так:
{
"long_field": {
"type": "long"
}
}
Если в этом случае вы можете установить флаг coerce
в false
, поскольку он true
по умолчанию и всегда будет попробуйте преобразовать строки в числа и усечь дроби для целых чисел.
{
"long_field": {
"type": "long",
"coerce": false
}
}
Если вы сделаете это, в следующий раз, когда вы попытаетесь индексировать длинное поле в виде строки, ES скажет вам следующее:
MapperParsingException[failed to parse [long_field]]; nested: IllegalArgumentException[Long value passed as String];