JSON データには、オブジェクト型とネスト型があります。JSON オブジェクトをクエリするには、目的のクエリタイプを直接使用できます。JSON ネスト型をクエリするには、クエリ条件を NestedQuery でラップする必要があります。
前提条件
データテーブル上でのサーチインデックスの作成と JSON フィールドの型設定。
制限事項
ベクトル型のフィールドは 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());
}