すべてのプロダクト
Search
ドキュメントセンター

Tablestore:JSON クエリ

最終更新日:Dec 07, 2025

JSON データには、オブジェクト型とネスト型があります。JSON オブジェクトをクエリするには、目的のクエリタイプを直接使用できます。JSON ネスト型をクエリするには、クエリ条件を NestedQuery でラップする必要があります。

前提条件

制限事項

ベクトル型のフィールドは JSON では使用できません。

クエリシナリオ

データテーブルに String 型の id カラムと String 型の address カラムが含まれていると仮定します。address カラムには、JSON フォーマットのデータが格納されます。

ある行の `address` 列の値が [{ "country": "China", "city": "hangzhou" }, { "country": "usa", "city": "Seattle" }] であるとします。`address` 列がネスト型の場合、country="China" および city="Seattle" のクエリではその行は返されません。`address` 列がオブジェクト型の場合、クエリはその行を返します。

サンプルコード

JSON ネスト型のクエリ例

次の例では、`address` フィールドの同じネストされたオブジェクト内で、address.country が "China" で、address.city が "Seattle" という 2 つの条件を満たす行をクエリします。

public static void nestedQuery(SyncClient client) {
    // 条件 1: address サブ行の country フィールドの値が "China" である必要があります。
    TermQuery termQuery1 = new TermQuery();
    termQuery1.setFieldName("address.country");
    termQuery1.setTerm(ColumnValue.fromString("China"));

    // 条件 2: address サブ行の city フィールドの値が "Seattle" である必要があります。
    TermQuery termQuery2 = new TermQuery();
    termQuery2.setFieldName("address.city");
    termQuery2.setTerm(ColumnValue.fromString("Seattle"));

    // BoolQuery の AND 条件を使用して、両方の条件を満たすサブ行をクエリします。
    List<Query> mustQueries = new ArrayList<>();
    mustQueries.add(termQuery1);
    mustQueries.add(termQuery2);
    BoolQuery boolQuery = new BoolQuery();
    boolQuery.setMustQueries(mustQueries);

    // NestedQuery 内に BoolQuery を設定し、サブ行が複数のクエリ条件を同時に満たすように要求します。
    NestedQuery nestedQuery = new NestedQuery();    // クエリタイプを NestedQuery に設定します。
    nestedQuery.setPath("address");   // ネスト型カラムのパス (クエリ対象フィールドの親パス) を設定します。
    nestedQuery.setQuery(boolQuery);
    nestedQuery.setScoreMode(ScoreMode.None);

    SearchQuery searchQuery = new SearchQuery();
    searchQuery.setQuery(nestedQuery);

    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);

    SearchResponse resp = client.search(searchRequest);
    System.out.println("Row: " + resp.getRows());
}

JSON オブジェクト型のクエリ例

次の例では、address フィールドが、ネストされたオブジェクトを横断して、address.country が "China" であり、かつ address.city が "Seattle" であるという 2 つの条件を満たす行をクエリします。

public static void boolQuery(SyncClient client) {
    // 条件 1: address サブ行の country フィールドの値が "China" である必要があります。
    TermQuery termQuery1 = new TermQuery();
    termQuery1.setFieldName("address.country");
    termQuery1.setTerm(ColumnValue.fromString("China"));

    // 条件 2: address サブ行の city フィールドの値が "Seattle" である必要があります。
    TermQuery termQuery2 = new TermQuery();
    termQuery2.setFieldName("address.city");
    termQuery2.setTerm(ColumnValue.fromString("Seattle"));

    // BoolQuery の AND 条件を使用して、両方の条件を満たすサブ行をクエリします。
    List<Query> mustQueries = new ArrayList<>();
    mustQueries.add(termQuery1);
    mustQueries.add(termQuery2);
    BoolQuery boolQuery = new BoolQuery();
    boolQuery.setMustQueries(mustQueries);


    SearchQuery searchQuery = new SearchQuery();
    searchQuery.setQuery(boolQuery);

    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);

    SearchResponse resp = client.search(searchRequest);
    System.out.println("Row: " + resp.getRows());
}