Tous les produits
Search
Centre de documentation

Tablestore:Nested query

Dernière mise à jour :Aug 18, 2026

Utilisez NestedQuery pour interroger les données des sous-lignes d'un champ imbriqué. Les types imbriqués ne sont pas interrogables directement : encapsulez la requête dans un objet NestedQuery et spécifiez le chemin du champ imbriqué ainsi qu'une sous-requête. La sous-requête peut être de n'importe quel type.

Prérequis

Paramètres

Paramètre

Description

tableName

Nom de la table de données.

indexName

Nom de l'index de recherche.

path

Chemin du champ imbriqué. Par exemple, news.title désigne le sous-champ title situé dans le champ imbriqué news.

query

Requête à exécuter sur les sous-champs du champ imbriqué. Tous les types de requêtes sont pris en charge.

scoreMode

Mode de calcul du score à utiliser lorsqu'un champ contient plusieurs valeurs.

InnerHits

Configuration des sous-champs du champ imbriqué. Comprend les options suivantes :

  • sort : ordre de tri pour le renvoi des sous-lignes imbriquées.

  • offset : position de départ lorsque le champ imbriqué contient plusieurs sous-lignes.

  • limit : nombre maximal de sous-lignes à renvoyer lorsque le champ imbriqué contient plusieurs sous-lignes. Valeur par défaut : 3.

  • highlight : paramètres de mise en surbrillance pour les sous-champs imbriqués. Pour plus de détails, consultez la rubrique Résumé et mise en surbrillance.

Exemples

Exemple de requête imbriquée à un seul niveau

Interrogez les lignes où Col_Nested.Sub_Col_Keyword est égal à "happy". Col_Nested est un champ imbriqué dont les sous-lignes contiennent le sous-champ Sub_Col_Keyword.

/**
 * Sample nested data for Col_Nested: '[{Sub_Col_Keyword: "happy"},{Sub_Col_Keyword: "sunny"}]'
 */
client.search({
    tableName: "<TABLE_NAME>",
    indexName: "<SEARCH_INDEX_NAME>",
    searchQuery: {
        offset: 0,
        limit: 10, // To get only the row count without retrieving specific data, set limit to 0. This prevents any rows from being returned.
        query: { // Set the query type to 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 in the result indicates the total number of rows in the table. The default value is false, which means the total count is not returned.
    },
    columnToGet: { // The columns to return. You can set this to RETURN_SPECIFIED (return custom columns), RETURN_ALL (return all columns), RETURN_ALL_FROM_INDEX (return all columns from the search index), or RETURN_NONE (return no columns).
        returnType: TableStore.ColumnReturnType.RETURN_ALL
    }
}, function (err, data) {
    if (err) {
        console.log('error:', err);
        return;
    }
    console.log('success:', JSON.stringify(data, null, 2));
});

Exemple d'utilisation du résumé et de la mise en surbrillance dans une requête imbriquée

Utilisez NestedQuery pour trouver les lignes où le sous-champ Sub_Col_Text du champ imbriqué Col_Nested correspond à tablestore, et mettez en surbrillance les termes correspondants dans les résultats.

client.search({
    tableName: "<TABLE_NAME>",
    indexName: "<SEARCH_INDEX_NAME>",
    searchQuery: {
        offset: 0,
        limit: 10, // To get only the row count without retrieving specific data, set limit to 0. This prevents any rows from being returned.
        query: { // Set the query type to 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 in the result indicates the total number of rows in the table. The default value is false, which means the total count is not returned.
    },
    columnToGet: { // The columns to return. You can set this to RETURN_SPECIFIED (return custom columns), RETURN_ALL (return all columns), RETURN_ALL_FROM_INDEX (return all columns from the search index), or RETURN_NONE (return no columns).
        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, "");
});

/**
 * Prints the content of searchHit.
 * @param searchHits The searchHits.
 * @param prefix The prefix to add for nested structures to print hierarchical information.
 */
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 + "    ");
        }
    });
}

FAQ

Références

  • Les index de recherche prennent en charge les types de requêtes suivants : requête term, requête terms, requête match all, requête match, requête match phrase, requête prefix, requête range, requête wildcard, requête Boolean, requête geo, requête imbriquée, requête vectorielle et requête exists. Sélectionnez un type de requête adapté à vos besoins métier.

    Pour trier ou paginer les lignes correspondant aux conditions de la requête, utilisez la fonctionnalité de tri et de pagination. Pour plus d'informations, consultez la rubrique Tri et pagination.

    Pour regrouper l'ensemble des résultats selon une colonne spécifique, utilisez la fonctionnalité de regroupement (distinct). Ainsi, les données du type spécifié n'apparaissent qu'une seule fois dans les résultats de la requête. Pour plus d'informations, consultez la rubrique Regroupement (distinct).

  • Pour analyser les données d'une table de données, par exemple pour obtenir les valeurs extrêmes, la somme et le nombre total de lignes, effectuez des opérations d'agrégation ou exécutez des instructions SQL. Pour plus d'informations, consultez les rubriques Agrégation et Requête SQL.

  • Pour obtenir rapidement toutes les lignes correspondant aux conditions de la requête sans avoir besoin de les trier, appelez les opérations ParallelScan et ComputeSplits afin d'utiliser la fonctionnalité d'analyse parallèle. Pour plus d'informations, consultez la rubrique Analyse parallèle.