来自JSON格式字符串的弹性搜索查询?

时间:2018-03-01 11:02:46

标签: elasticsearch cassandra elassandra

我正在使用弹性搜索,我需要从存储为JSON格式字符串的文档中查询值。

是否有任何选项可以查询存储JSON格式字符串的表单弹性搜索?

请参阅我的用例

我正在Cassandra中保存我的应用程序数据并将这些数据复制到弹性搜索(我正在使用elassandra捆绑版本)。但是在Cassandra中,我有一个带有列表的字段,它包含嵌套的JSON数组JSON对象。

当我将Cassandra表映射到弹性搜索时(根据elassandra doc的建议),它将Cassandra字段名称映射为弹性搜索中的JSON键,并将整个JSON数组视为JSON格式字符串。

现在我需要根据JSON中的密钥进行查询,这些密钥在弹性搜索中存储为JSON字符串。

请参阅弹性搜索中存储的数据样本

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

此状态为Cassandra字段名称,剩余为一条记录的值。

现在我需要使用deleteStatus = true搜索记录,任何线索,请。

提前致谢

3 个答案:

答案 0 :(得分:1)

您应该将状态对象存储为由UDT(Cassandra用户定义类型)支持的Elasticsearch对象,然后,您将能够使用elasticsearch嵌套查询进行搜索。

您可以使用状态列的UDT创建cassandra架构并自动发现映射,或指定elasticsearch映射以生成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();

答案 1 :(得分:1)

我不确定我的解决方案是否合适。

您可以尝试使用JSON processor

答案 2 :(得分:0)

elassandra不支持摄取处理器,您应该使用建议的映射来索引UDT。 感谢。