3

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

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

请看我的用例

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

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

现在我需要根据 JSON 中的键进行查询,这些键在 Elasticsearch 中存储为 JSON 字符串。

请查看我存储在 Elasticsearch 中的数据示例:

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

这里 status 是 Cassandra 字段名称,其余是一条记录的值。

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

提前致谢

4

3 回答 3

3

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

您可以使用状态列的 UDT 创建 cassandra 架构并自动发现映射,或指定弹性搜索映射以生成 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();
于 2018-03-01T14:06:44.153 回答
1

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

您可以尝试使用 JSON 处理器吗

于 2018-03-11T06:23:06.380 回答
0

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

于 2018-03-18T14:34:36.860 回答