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

Tablestore:ネストされたクエリ

最終更新日:Dec 28, 2024

ネストされたフィールドのサブフィールド内のデータをクエリするために、ネストされたクエリを実行できます。ネストされたフィールドは直接クエリできません。ネストされたフィールドをクエリするには、NestedQueryオブジェクトでネストされたフィールドのパスとサブクエリを指定する必要があります。サブクエリは任意のタイプのクエリにすることができます。

前提条件

パラメータ

パラメータ

説明

path

ネストされたフィールドのパス。ネストされたフィールドはツリー構造を使用します。たとえば、news.titleは、newsという名前のネストされたフィールド内のtitleサブフィールドを指定します。

query

ネストされたフィールド内のサブフィールドに対するクエリ。クエリは任意のタイプのクエリにすることができます。

score_mode

フィールドに複数の値が含まれている場合、スコアを計算するために使用される値。

table_name

データテーブルの名前。

index_name

検索インデックスの名前。

inner_hits

ネストされたフィールド内のサブフィールドの設定。

  • sort:ネストされたフィールド内のサブフィールドの並べ替えルール。

  • offset:ネストされたフィールドが複数のサブフィールドで構成されている場合に返す最初のサブフィールド

  • limit:ネストされたフィールドが複数のサブフィールドで構成されている場合に返すサブフィールドの最大数。デフォルト値:3。

  • highlight:ネストされたフィールド内のサブフィールドに対してハイライト機能を有効にするかどうかを指定します。詳細については、クエリ結果のハイライトを参照してください。

単一レベルのネストされたフィールド

次の例は、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

参考資料