Эластичный поисковый запрос из строки в формате JSON?

Я работаю с эластичным поиском, и мне нужно запросить значение из документа, который хранится в виде строки в формате JSON.

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

Пожалуйста, смотрите мой вариант использования

Я сохраняю данные своего приложения в Cassandra и тиражирую эти данные для упругого поиска (я использую для него версию elassandra в комплекте). Но в Cassandra у меня есть поле со списком, и он содержит массив JSON с вложенными объектами JSON.

Когда я сопоставляю таблицу Cassandra с упругим поиском (согласно предложению elassandra doc), он отображает имя поля Cassandra как ключ JSON в упругом поиске, а весь массив JSON рассматривается как строка в формате JSON.

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

пожалуйста, посмотрите образец моих данных, хранящихся в упругом поиске

    {
    "status": {
        \"visibilityStatus\": true,
        \"deleteStatus\": true
    }
}

Здесь статус - имя поля Кассандры, а оставшееся значение - одна запись.

Теперь мне нужно найти запись с deleteStatus = true, любая подсказка, пожалуйста.

заранее спасибо

3 ответа

Решение

Вы должны сохранить свой статусный объект как объект Elasticsearch, поддерживаемый UDT (определяемый пользователем тип Cassandra), и тогда вы сможете выполнять поиск с вложенным запросом эластичного поиска.

Вы можете создать свою схему cassandra с помощью UDT для столбца состояния и автоматически обнаружить сопоставление или указать сопоставление asticsearch для генерации схемы CQL. Необязательный cql_udt_name позволяет назвать имя UDT, как показано ниже:

XContentBuilder mapping = XContentFactory.jsonBuilder()
                .startObject()
                    .startObject("properties")
                        .startObject("id").field("type", "keyword").field("cql_collection", "singleton").field("cql_primary_key_order", 0).field("cql_partition_key", true).endObject()
                        .startObject("event_timestamp")
                            .field("type", "date")
                            .field("format", "strict_date_hour_minute_second||epoch_millis")
                            .field("cql_collection", "singleton")
                        .endObject()
                        .startObject("event_info")
                            .field("type", "nested")
                            .field("cql_collection", "singleton")
                            .field("cql_udt_name", "event_info_udt")
                            .field("dynamic", "false")
                            .startObject("properties")
                               .startObject("event_timestamp")
                                .field("type", "date")
                                .field("format", "strict_date_hour_minute_second||epoch_millis")
                                .field("cql_collection", "singleton")
                            .endObject()
                        .endObject()
                    .endObject()
                    .endObject()
                .endObject();

Я не уверен, что мое решение подходит вам.

Можете ли вы попробовать с процессором JSON

Процессор Ingest не поддерживается elassandra, вы должны использовать предложенное отображение для индексации вашего UDT. Благодарю.

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