JSON データは Object 型または Nested 型にすることができます。Object 型のデータをクエリするには、必要なクエリタイプを直接使用できます。Nested 型のデータをクエリするには、クエリ条件を NestedQuery でラップする必要があります。
前提条件
Tablestore クライアントの初期化が完了していること。
データテーブルに検索インデックスが作成され、JSON フィールドの型が設定されていること。
制限事項
ベクトル型のフィールドは JSON では使用できません。
クエリシナリオ
データテーブルに String 型の `id` カラムと String 型の `address` カラムが含まれているとします。`address` カラムには、JSON フォーマットのデータが格納されます。
ある行の `address` カラムの値が [{ "country": "China", "city": "hangzhou" }, { "country": "usa", "city": "Seattle" }] であるとします。`address` カラムが Nested 型の場合、country="China" と city="Seattle" のクエリではこの行は返されません。`address` カラムが Object 型の場合、このクエリはこの行を返します。
例
JSON Nested 型クエリの例
次の例では、`address` フィールドの単一のネストされた要素が、address.country が 'China' であり、かつ address.city が 'Seattle' であるという 2 つの条件を満たす行をクエリする方法を示します。
from tablestore import *
def nested_query(client):
# 条件1:address のサブ行にある country は "China" である必要があります。
term_query1 = TermQuery('address.country','China')
# 条件2:address のサブ行にある city は "Seattle" である必要があります。
term_query2 = TermQuery('address.city', 'Seattle')
# BoolQuery と AND 条件を使用して、両方のクエリを満たすサブ行を検索します。
bool_query = BoolQuery(
must_queries=[term_query1, term_query2]
)
# NestedQuery 内で BoolQuery を使用して、単一のサブ行が複数の条件を満たすように指定します。
nested_query = NestedQuery(
path="address", # ネストされたカラムへのパス。クエリ対象フィールドの親パスです。
query=bool_query, # 内部クエリ条件。
score_mode=ScoreMode.NONE # スコアリングモード。None に設定します。
)
# 検索クエリを構築します。
search_query = SearchQuery(
query=nested_query
)
# 検索を実行します。
resp = client.search(table_name='<TABLE_NAME>',index_name='<SEARCH_INDEX_NAME>',
search_query=search_query)
print("Row:", resp.rows)
JSON Object 型クエリの例
次の例では、`address` カラムで address.country が 'China' であり、かつ address.city が 'Seattle' であるという 2 つの条件を満たす行をクエリする方法を示します。
from tablestore import *
def bool_query(client):
# 条件1:address のサブ行にある country は "China" である必要があります。
term_query1 = TermQuery('address.country','China')
# 条件2:address のサブ行にある city は "Seattle" である必要があります。
term_query2 = TermQuery('address.city','Seattle')
# BoolQuery と AND 条件を使用して、両方のクエリを満たすサブ行を検索します。
bool_query = BoolQuery(
must_queries=[term_query1, term_query2]
)
# 検索クエリを構築します。
search_query = SearchQuery(
query=bool_query
)
# 検索を実行します。
resp = client.search(table_name='<TABLE_NAME>',index_name='<SEARCH_INDEX_NAME>',
search_query=search_query)
print("Row:", resp.rows)