3

私は Elasticsearch を使用しており、JSON 形式の文字列として保存されているドキュメントから値をクエリする必要があります。

JSON形式の文字列を格納したElasticsearchからクエリを実行するオプションはありますか?

私のユースケースをご覧ください

アプリケーション データを Cassandra に保存し、これらのデータを Elastic Search に複製しています (そのためにelassandraバンドル バージョンを使用しています)。list<text>しかし、Cassandra には、ネストされた JSON オブジェクトを含む JSON 配列を保持するフィールドがあります。

Cassandra テーブルを Elasticsearch にマップすると (elassandra doc で提案されているように)、Cassandra フィールド名が Elasticsearch の JSON キーとしてマッピングされ、JSON 配列全体が JSON 形式の文字列と見なされます。

ここで、Elasticsearch に JSON 文字列として保存されている JSON 内のキーに基づいてクエリを実行する必要があります。

Elasticsearch に保存されている私のデータのサンプルをご覧ください。

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

ここで status は Cassandra のフィールド名で、remaining は 1 レコードの値です。

次に、レコードを検索する必要がありますdeleteStatus=true。手がかりがあればお願いします。

前もって感謝します

4

3 に答える 3

3

ステータス オブジェクトを 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();
于 2018-03-01T14:06:44.153 に答える
1

私の解決策があなたにとって大丈夫かどうかわかりません。

JSON プロセッサで試してみることができますか

于 2018-03-11T06:23:06.380 に答える