ネストされたフィールドのサブフィールド内のデータをクエリするために、ネストされたクエリを実行できます。ネストされたフィールドは直接クエリできません。ネストされたフィールドをクエリするには、NestedQueryオブジェクトでネストされたフィールドのパスとサブクエリを指定する必要があります。サブクエリは任意のタイプのクエリにすることができます。
前提条件
OTSClientインスタンスが初期化されていること。詳細については、OTSClientインスタンスの初期化を参照してください。
データテーブルが作成され、データがデータテーブルに書き込まれていること。詳細については、データテーブルの作成とデータの書き込みを参照してください。
データテーブルの検索インデックスが作成されていること。詳細については、検索インデックスの作成を参照してください。
パラメータ
パラメータ | 説明 |
path | ネストされたフィールドのパス。ネストされたフィールドはツリー構造を使用します。たとえば、news.titleは、newsという名前のネストされたフィールド内のtitleサブフィールドを指定します。 |
query | ネストされたフィールド内のサブフィールドに対するクエリ。クエリは任意のタイプのクエリにすることができます。 |
score_mode | フィールドに複数の値が含まれている場合、スコアを計算するために使用される値。 |
table_name | データテーブルの名前。 |
index_name | 検索インデックスの名前。 |
inner_hits | ネストされたフィールド内のサブフィールドの設定。
|
例
単一レベルのネストされたフィールド
次の例は、col_nested.col_longフィールドの値が100以上300以下の行をクエリする方法を示しています。
Tablestore SDK for Python V5.2.1以降を使用してネストされたクエリを実行する
Tablestore SDK for Python V5.2.1以降を使用してネストされたクエリを実行する場合、デフォルトでSearchResponseオブジェクトが返されます。次のコードはサンプルリクエストを示しています。
nested_query = RangeQuery('col_nested.col_long', range_from=100, range_to=300, include_lower=True, include_upper=True) query = NestedQuery('col_nested', nested_query) search_response = client.search( '<TABLE_NAME>', '<SEARCH_INDEX_NAME>', SearchQuery(query, limit=100, get_total_count=True), ColumnsToGet(return_type=ColumnReturnType.ALL) ) print('request_id : %s' % search_response.request_id) print('is_all_succeed : %s' % search_response.is_all_succeed) print('total_count : %s' % search_response.total_count) print('rows : %s' % search_response.rows)
次のサンプルリクエストを使用して、TUPLE結果を返すことができます。
nested_query = RangeQuery('col_nested.col_long', range_from=100, range_to=300, include_lower=True, include_upper=True) query = NestedQuery('col_nested', nested_query) rows, next_token, total_count, is_all_succeed, agg_result, group_by_results = client.search( '<TABLE_NAME>', '<SEARCH_INDEX_NAME>', SearchQuery(query, limit=100, get_total_count=True), ColumnsToGet(return_type=ColumnReturnType.ALL) ).v1_response()
5.2.1より前のバージョンのTablestore SDK for Pythonを使用してネストされたクエリを実行する
5.2.1より前のバージョンのTablestore SDK for Pythonを使用してネストされたクエリを実行する場合、デフォルトでTUPLE結果が返されます。次のコードはサンプルリクエストを示しています。
nested_query = RangeQuery('col_nested.col_long', range_from=100, range_to=300, include_lower=True, include_upper=True) query = NestedQuery('col_nested', nested_query) rows, next_token, total_count, is_all_succeed = client.search( '<TABLE_NAME>', '<SEARCH_INDEX_NAME>', SearchQuery(query, limit=100, get_total_count=True), ColumnsToGet(return_type=ColumnReturnType.ALL) )
ハイライト機能が有効になっているネストされたフィールド
次のサンプルコードは、col_nested.col_textフィールドの値がtablestore
である行をクエリし、クエリ結果のキーワードをハイライトする方法の例を示しています。
def _print_rows(request_id, rows, total_count):
print('リクエストID:%s' % request_id) # 翻訳: Request ID
for row in rows:
print(row)
print('返された行数: %d' % len(rows)) # 翻訳: Rows return
print('合計件数: %d' % total_count) # 翻訳: Total count
def _print_search_hit(hits):
for search_hit in hits:
print('\t スコア:%.6f' % search_hit.score) # 翻訳: score
for highlight_field in search_hit.highlight_result.highlight_fields:
print('\t\t ハイライト:%s:%s' % (highlight_field.field_name, highlight_field.field_fragments)) # 翻訳: highlight
for inner_result in search_hit.search_inner_hits:
print('\t\t パス:%s' % (inner_result.path)) # 翻訳: path
_print_search_hit(inner_result.search_hits)
def highlight_query_for_nested(client):
print('********** HighlightQueryForNested 開始 **********') # 翻訳: Begin
sort = Sort(
sorters=[FieldSort('col_nested.col_long', sort_order=SortOrder.ASC)]
)
highlight_parameter = HighlightParameter("col_nested.col_text", 1, 18, '<b>', '</b>', HighlightFragmentOrder.TEXT_SEQUENCE)
highlight_clause = Highlight([highlight_parameter], HighlightEncoder.PLAIN_MODE)
inner_hits_parameter = InnerHits(None, 0, 10, highlight_clause)
query = NestedQuery('n', MatchQuery('col_nested.col_text', 'tablestore'), ScoreMode.AVG, inner_hits_parameter)
search_response = client.search('<TABLE_NAME>', '<SEARCH_INDEX_NAME>',
SearchQuery(query, limit=2, get_total_count=True),
ColumnsToGet(return_type=ColumnReturnType.ALL_FROM_INDEX)
)
print('----- 行の出力:') # 翻訳: Print Rows
print('検索行数:%d' % len(search_response.rows)) # 翻訳: search rows count
_print_rows(search_response.request_id,search_response.rows,search_response.total_count)
print('----- ハイライト結果の出力:') # 翻訳: Print Highlight Result
search_hits = search_response.search_hits
print('検索ヒット数:%d' % len(search_hits)) # 翻訳: search hit count
_print_search_hit(search_hits)
print('********** HighlightQuery 終了 **********') # 翻訳: End
FAQ
参考資料
検索インデックスを使用してデータをクエリする場合、次のクエリメソッドを使用できます。用語クエリ、複数用語クエリ、すべて一致クエリ、一致クエリ、一致フレーズクエリ、プレフィックスクエリ、範囲クエリ、ワイルドカードクエリ、地理クエリ、ブールクエリ、KNNベクトル検索クエリ、ネストされたクエリ、存在クエリ。検索インデックスによって提供されるクエリメソッドを使用して、ビジネス要件に基づいて複数のディメンションからデータをクエリできます。
クエリ条件を満たす行を、並べ替えおよびページング機能を使用して並べ替えたりページネーションしたりできます。詳細については、並べ替えとページングを参照してください。
折りたたみ(重複排除)機能を使用して、特定の列に基づいて結果セットを折りたたむことができます。このようにして、指定されたタイプのデータはクエリ結果に1回だけ表示されます。詳細については、折りたたみ(重複排除)を参照してください。
データテーブル内のデータを分析する場合、Search操作の集計機能を使用するか、SQLステートメントを実行できます。たとえば、最小値と最大値、合計、および行の総数を取得できます。詳細については、集計とSQLクエリを参照してください。
行を並べ替えることなく、クエリ条件を満たすすべての行を取得する場合、ParallelScanおよびComputeSplits操作を呼び出して並列スキャン機能を使用できます。詳細については、並列スキャンを参照してください。