Строка эластичного поиска JSON: индексация JSONObject

Могут упругие значения индекса поиска, такие как

"key": [
            14.0,
            "somestring"
        ]

если я пытаюсь принять эти данные, я получаю эту ошибку

org.elasticsearch.hadoop.rest.EsHadoopInvalidRequest: Found unrecoverable error [Bad Request(400) - [WriteFailureException; nested: MapperParsingException[failed to parse [FIXMessage.key]]; nested: NumberFormatException[For input string: "somestring"]; ]]; Bailing out..

во-первых, является ли приведенный выше допустимый формат JSON? Если так, то почему эластик не может его индексировать?

2 ответа

Решение

Elasticsearch пытается конвертировать "somestring" к числу, и не удается.

Ваш json действителен, и Elasticsearch с радостью будет индексировать несколько значений для одного и того же поля из массива значений, но все они должны иметь одинаковый тип, и тип должен соответствовать типу соответствующего поля в отображении.

Если поле в отображении не существует, Elasticsearch создаст его, используя разумный тип по умолчанию, основываясь на первом значении, которое он видит для этого поля. Так что, если вы попытались проиндексировать то, что вы разместили выше, и "key" поле не существует, Elasticsearch создаст поле, посмотрите на первое найденное значение (14.0) и решили использовать float тип. Затем он попытается проиндексировать второе значение, "somestring", не удалось преобразовать его в число с плавающей точкой и отправить обратно ошибку.

Есть смысл?

Вы можете найти этот пост полезным.

Это зависит от того, что вы планируете делать с данными. Если вы хотите только сохранить и получить полный массив, вы можете просто преобразовать массив JSON в строку.

Когда вы хотите получить массив из Elastic, вы должны преобразовать обратно из строки в массив JSON.

Если вы также хотите искать внутри этого массива, вы можете разбить массив на несколько массивов, различая его по типу.

Другие вопросы по тегам