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

Tablestore:ネストクエリ

最終更新日:Dec 28, 2024

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

前提条件

パラメーター

パラメーター

説明

tableName

データテーブルの名前。

indexName

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

path

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

query

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

scoreMode

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

InnerHits

ネストフィールドのサブフィールドの設定。

  • sort: ネストフィールドの子行のソートルール。

  • offset: ネストフィールドが複数の子行で構成されている場合に返す子行の開始位置。

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

  • highlight: ネストフィールドのサブフィールドのハイライト設定。詳細については、ハイライトを参照してください。

単一レベルのネストフィールドのクエリ

次のサンプルコードは、Col_Nested ネストフィールドの Sub_Col_Keyword サブフィールドの値が Hangzhou である行をクエリする方法の例を示しています。

/**
 * Col_Nested: '[{Sub_Col_Keyword: "Hangzhou"},{Sub_Col_Keyword: "Shanghai"}]'
 */
client.search({
    tableName: "<テーブル名>",
    indexName: "<検索インデックス名>",
    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: "Hangzhou"
                    }
                },
            }
        },
        getTotalCount: true // クエリ条件を満たす行の総数を返すかどうかを指定します。デフォルト値: 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));
});

ネストクエリのクエリ結果でクエリ文字列をハイライトする

次のサンプルコードは、Col_Nested という名前のネストフィールドの Sub_Col_Text サブフィールドの値が tablestore と一致する行をクエリし、クエリ結果でクエリ文字列をハイライトする方法の例を示しています。

client.search({
    tableName: "<テーブル名>",
    indexName: "<検索インデックス名>",
    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: "<b>",
                                postTag: "</b>",
                                fragmentsOrder: TableStore.HighlightFragmentOrder.TEXT_SEQUENCE,
                                fragmentSize: 20,
                                numberOfFragments: 3,
                            }
                        ]
                    }
                },
            }
        },
        getTotalCount: true // クエリ条件を満たす行の総数を返すかどうかを指定します。デフォルト値: 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, "");
});

/**
 * クエリ条件を満たすコンテンツを表示します。
 * @param searchHits searchHits
 * 出力が @param prefix ネスト構造を使用する場合は、プレフィックスを追加して階層情報を表示します。
 */
function printSearchHit(searchHits, prefix) {
    TableStore.util.arrayEach(searchHits, function (searchHit) {
        if (searchHit.highlightResultItem != null) {
            console.log(prefix + "ハイライト: \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 + "パス: " + key + "\n");
            console.log(prefix + "InnerHit: \n");
            printSearchHit(val.subSearchHits, prefix + "    ");
        }
    });
}

FAQ

参考資料