Эластичный поисковый запрос из строки в формате 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. Благодарю.