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

Tablestore:ネストされたクエリ

最終更新日:May 01, 2026

NestedQuery を使用して、ネストされたフィールドのサブ行内のデータをクエリします。ネスト型は直接クエリできません。NestedQuery でクエリをラップし、ネストされたフィールドのパスとサブクエリを指定する必要があります。サブクエリには任意のクエリタイプを使用できます。

前提条件

パラメーター

パラメーター

説明

tableName

データテーブルの名前です。

indexName

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

path

ネストされたフィールドのパスです。たとえば、news.title は、ネストされた news フィールド内の title サブフィールドを指します。

query

ネストされたフィールドのサブフィールドに対して実行するクエリです。任意のクエリタイプがサポートされます。

scoreMode

フィールドに複数の値が含まれる場合に使用するスコアモードです。

InnerHits

ネストされたフィールドのサブフィールドに関する設定です。以下のオプションが含まれます。

  • sort:ネストされたサブ行を返す際のソート順です。

  • offset:ネストされたフィールドに複数のサブ行が含まれる場合の開始位置です。

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

  • highlight:ネストされたサブフィールドのハイライト設定です。詳細については、「まとめとハイライト」をご参照ください。

使用例

単一レベルのネストされたクエリの例

Col_Nested.Sub_Col_Keyword"happy" に等しい行をクエリします。Col_Nested はネストされたフィールドであり、そのサブ行には Sub_Col_Keyword サブフィールドが含まれます。

/**
 * Col_Nested のサンプルネストデータ: '[{Sub_Col_Keyword: "happy"},{Sub_Col_Keyword: "sunny"}]'
 */
client.search({
    tableName: "<TABLE_NAME>",
    indexName: "<SEARCH_INDEX_NAME>",
    searchQuery: {
        offset: 0,
        limit: 10, // 特定のデータを取得せずに件数のみを取得する場合は、limit を 0 に設定します。これにより、行が返されなくなります。
        query: { // クエリタイプを TableStore.QueryType.NESTED_QUERY に設定します。
            queryType: TableStore.QueryType.NESTED_QUERY,
            query: {
                path: "Col_Nested",
                query: {
                    queryType: TableStore.QueryType.TERM_QUERY,
                    query: {
                        fieldName: "Col_Nested.Sub_Col_Keyword",
                        term: "happy"
                    }
                },
            }
        },
        getTotalCount: true // 結果の TotalCount はテーブル内の行の総数を示します。デフォルト値は false で、この場合総件数は返されません。
    },
    columnToGet: { // 返すカラムを指定します。RETURN_SPECIFIED(カスタムカラムを返す)、RETURN_ALL(すべてのカラムを返す)、RETURN_ALL_FROM_INDEX(多次元インデックスからすべてのカラムを返す)、または RETURN_NONE(カラムを返さない)に設定できます。
        returnType: TableStore.ColumnReturnType.RETURN_ALL
    }
}, function (err, data) {
    if (err) {
        console.log('error:', err);
        return;
    }
    console.log('success:', JSON.stringify(data, null, 2));
});

ネストされたクエリでのまとめとハイライトの使用例

NestedQuery を使用して、Col_Nested ネストフィールド内の Sub_Col_Text サブフィールドが tablestore に一致する行を検索し、結果内で一致した語句をハイライトします。

client.search({
    tableName: "<TABLE_NAME>",
    indexName: "<SEARCH_INDEX_NAME>",
    searchQuery: {
        offset: 0,
        limit: 10, // 特定のデータを取得せずに件数のみを取得する場合は、limit を 0 に設定します。これにより、行が返されなくなります。
        query: { // クエリタイプを TableStore.QueryType.NESTED_QUERY に設定します。
            queryType: TableStore.QueryType.NESTED_QUERY,
            query: {
                path: "Col_Nested",
                query: {
                    queryType: TableStore.QueryType.MATCH_QUERY,
                    query: {
                        fieldName: "Col_Nested.Sub_Col_Text",
                        text: "tablestore"
                    }
                },
                innerHits: {
                    sort: {
                        sorters: [
                            {
                                scoreSort: {
                                    order: TableStore.SortOrder.SORT_ORDER_DESC
                                }
                            },
                            {
                                docSort: {
                                    order: TableStore.SortOrder.SORT_ORDER_ASC
                                }
                            },
                        ],
                    },
                    highlight: {
                        highlightParameters: [
                            {
                                fieldName:"Col_Nested.Sub_Col_Text",
                                preTag: "",
                                postTag: "",
                                fragmentsOrder: TableStore.HighlightFragmentOrder.TEXT_SEQUENCE,
                                fragmentSize: 20,
                                numberOfFragments: 3,
                            }
                        ]
                    }
                },
            }
        },
        getTotalCount: true // 結果の TotalCount はテーブル内の行の総数を示します。デフォルト値は false で、この場合総件数は返されません。
    },
    columnToGet: { // 返すカラムを指定します。RETURN_SPECIFIED(カスタムカラムを返す)、RETURN_ALL(すべてのカラムを返す)、RETURN_ALL_FROM_INDEX(多次元インデックスからすべてのカラムを返す)、または RETURN_NONE(カラムを返さない)に設定できます。
        returnType: TableStore.ColumnReturnType.RETURN_ALL
    }
}, function (err, data) {
    if (err) {
        console.log('error:', err);
        return;
    }
    console.log('success:', JSON.stringify(data.rows, null, 2));

    printSearchHit(data.searchHits, "");
});

/**
 * searchHit の内容を出力します。
 * @param searchHits searchHits オブジェクト。
 * @param prefix 階層構造を出力するためにネストされた構造に付加するプレフィックス。
 */
function printSearchHit(searchHits, prefix) {
    TableStore.util.arrayEach(searchHits, function (searchHit) {
        if (searchHit.highlightResultItem != null) {
            console.log(prefix + "Highlight: \n");
            var strBuilder = ""
            for  (const [key,val]  of searchHit.highlightResultItem.highlightFields.entries()) {
                strBuilder += key + ":[";
                strBuilder += val.fragments.join(",") + "]\n";
                console.log(strBuilder);
            }
        }
        for  (const [key,val]  of searchHit.searchInnerHits.entries()) {
            console.log(prefix + "Path: " + key + "\n");
            console.log(prefix + "InnerHit: \n");
            printSearchHit(val.subSearchHits, prefix + "    ");
        }
    });
}

よくある質問

関連ドキュメント