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];