Tous les produits
Search
Centre de documentation

Tablestore:Requête imbriquée

Dernière mise à jour :Sep 28, 2026

Une requête imbriquée permet d'interroger les données contenues dans les lignes enfants des champs imbriqués. Ces derniers ne peuvent pas être interrogés directement. Pour interroger un champ imbriqué, spécifiez son chemin ainsi qu'une sous-requête au sein d'un objet NestedQuery. Cette sous-requête peut être de n'importe quel type.

Important
  • Seuls les champs imbriqués peuvent faire l'objet de requêtes imbriquées.

  • Il est possible d'interroger simultanément des champs imbriqués et d'autres types de champs dans une même requête. Pour plus d'informations sur le type de champ imbriqué, reportez-vous à Type de données imbriquées.

Opération API

Pour exécuter une requête imbriquée, appelez l'opération Search ou ParallelScan et définissez le type de requête sur NestedQuery.

Paramètres

Paramètre

Description

path

Chemin du champ imbriqué, structuré de manière arborescente. Par exemple, news.title désigne le sous-champ title du champ imbriqué nommé news.

query

Requête à exécuter sur le sous-champ du champ imbriqué. Elle peut être de n'importe quel type.

scoreMode

Valeur utilisée pour calculer le score lorsqu'un champ contient plusieurs valeurs.

getTotalCount

Indique s'il faut renvoyer le nombre total de lignes correspondant aux conditions de la requête. La valeur par défaut est false, ce qui signifie que ce total n'est pas renvoyé.

Si vous définissez ce paramètre sur true, les performances de la requête se dégradent.

weight

Pondération attribuée au champ interrogé pour calculer le score de pertinence des mots-clés basé sur BM25. Ce paramètre s'utilise dans les scénarios de recherche en texte intégral. Plus la pondération est élevée, plus le score de pertinence BM25 du champ augmente. Il s'agit d'un nombre décimal positif.

Ce paramètre n'a aucune incidence sur le nombre de lignes renvoyées. En revanche, il influence les scores de pertinence BM25 des résultats de la requête.

tableName

Nom de la table de données.

indexName

Nom de l'index de recherche.

columnsToGet

Détermine si toutes les colonnes de chaque ligne correspondant aux conditions de la requête doivent être renvoyées. Vous pouvez configurer les paramètres returnAll et columns pour ce paramètre.

La valeur par défaut du paramètre returnAll est false, ce qui signifie que toutes les colonnes ne sont pas renvoyées. Dans ce cas, utilisez le paramètre columns pour spécifier celles à renvoyer. Si vous ne précisez rien, seules les colonnes de clé primaire sont renvoyées.

Si vous définissez le paramètre returnAll sur true, toutes les colonnes sont renvoyées.

InnerHits

Paramètres des sous-champs du champ imbriqué.

  • sort : règle de tri des lignes enfants du champ imbriqué.

  • offset : position de départ des lignes enfants à renvoyer lorsque le champ imbriqué comporte plusieurs lignes enfants.

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

  • highlight : paramètres de mise en surbrillance des sous-champs du champ imbriqué. Pour plus d'informations, consultez Mise en surbrillance.

Méthodes

Vous pouvez exécuter une requête imbriquée via la console Tablestore ou les SDK Tablestore. Avant toute opération, assurez-vous d'avoir effectué les préparatifs suivants :

  • Créez un compte Alibaba Cloud ou un utilisateur RAM disposant des permissions nécessaires sur Tablestore. Pour savoir comment accorder ces permissions à un utilisateur RAM, reportez-vous à Utiliser une politique RAM pour accorder des permissions à un utilisateur RAM.

    Si vous prévoyez d'utiliser les SDK Tablestore pour exécuter une requête imbriquée, créez une paire AccessKey pour votre compte Alibaba Cloud ou votre utilisateur RAM. Pour plus d'informations, reportez-vous à Créer une paire AccessKey.

    Avertissement

    La paire AccessKey d'un compte Alibaba Cloud donne accès à toutes les opérations API. Nous vous recommandons d'utiliser un utilisateur RAM pour appeler les opérations API ou effectuer les tâches d'exploitation et de maintenance courantes. Évitez également d'inscrire en dur l'ID AccessKey et le secret AccessKey dans le code de votre projet. Une telle pratique risque d'entraîner une fuite de vos identifiants et de compromettre la sécurité de l'ensemble des ressources de votre compte.

  • Créez une table de données. Pour plus d'informations, reportez-vous à Opérations sur une table de données.

  • Créez un index de recherche pour cette table de données. Pour plus d'informations, reportez-vous à Créer un index de recherche.

  • Lorsque vous passez par les SDK Tablestore pour exécuter une requête imbriquée, initialisez au préalable une instance OTSClient. Pour plus d'informations, reportez-vous à Initialiser une instance OTSClient.

Utiliser la console Tablestore

La console Tablestore permet uniquement d'interroger les données des champs imbriqués à un seul niveau lors d'une requête imbriquée.

  1. Accédez à l'onglet Index Management.

    1. Connectez-vous à la console Table Store.

    2. Dans la barre de navigation supérieure, sélectionnez un groupe de ressources et une région.

    3. Sur la page Overview, cliquez sur le nom de l'instance ou sur Instance Management dans la colonne Actions.

    4. Dans l'onglet Instance Details, puis sous l'onglet Data Table List, cliquez sur le nom de la table de données ou sur Index Management dans la colonne Actions.

  2. Dans l'onglet Index Management, repérez l'index de recherche cible et cliquez sur Search dans la colonne Actions.

  3. Dans la boîte de dialogue Search, interrogez les données.

    1. Par défaut, toutes les colonnes sont renvoyées. Pour n'en afficher que certaines, désactivez l'option Retrieve All Columns et saisissez les noms des colonnes souhaitées, séparés par des virgules.

      Remarque

      Par défaut, Table Store renvoie les colonnes de clé primaire de la table de données.

    2. Choisissez un opérateur logique : And, Or ou Not.

      Avec l'opérateur And, la requête renvoie les données satisfaisant toutes les conditions spécifiées. L'opérateur Or retourne les données répondant à au moins l'une des conditions. Enfin, l'opérateur Not exclut les données correspondant aux conditions indiquées.

    3. Sélectionnez un champ de type imbriqué et cliquez sur Add.

    4. Choisissez un sous-champ, définissez le type de requête selon vos besoins (par exemple TermQuery) et saisissez la valeur à rechercher.

    5. Le tri est désactivé par défaut. Pour ordonner les résultats selon un champ précis, activez l'option Enable Sorting, ajoutez le champ de tri et configurez l'ordre souhaité.

    6. L'agrégation est également désactivée par défaut. Pour réaliser une agrégation statistique sur un champ donné, activez Enable Aggregation, ajoutez le champ concerné et ajustez les paramètres d'agrégation.

  4. Cliquez sur OK.

    Les résultats de la requête s'affichent alors dans l'onglet Index Management.

Utiliser les SDK Tablestore

Un SDK permet d'interroger les données de champs imbriqués à un ou plusieurs niveaux. Lors d'une requête imbriquée, vous avez la possibilité d'activer la fonctionnalité de mise en surbrillance pour faire ressortir les mots-clés dans les résultats. Pour plus de détails, reportez-vous à mise en surbrillance.

Plusieurs SDK Tablestore prennent en charge les requêtes imbriquées : Tablestore SDK for Java, Tablestore SDK for Go, Tablestore SDK for Python, Tablestore SDK for Node.js, Tablestore SDK for .NET et Tablestore SDK for PHP. Les exemples suivants s'appuient sur le SDK Tablestore for Java.

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

L'exemple suivant illustre la recherche de données où col_nested.nested_1 vaut tablestore. Ici, col_nested représente un champ imbriqué dont les lignes enfants contiennent les colonnes nested_1 et nested_2.

private static void nestedQuery(SyncClient client) {
    SearchQuery searchQuery = new SearchQuery();
    NestedQuery nestedQuery = new NestedQuery(); // Set the query type to NestedQuery.
    nestedQuery.setPath("col_nested"); // Set the path of the nested column.
    TermQuery termQuery = new TermQuery(); // Construct the subquery for NestedQuery.
    termQuery.setFieldName("col_nested.nested_1"); // Set the column name. Note that it includes the path of the nested column.
    termQuery.setTerm(ColumnValue.fromString("tablestore")); // Set the value to query.
    nestedQuery.setQuery(termQuery);
    nestedQuery.setScoreMode(ScoreMode.None);
    searchQuery.setQuery(nestedQuery);
    //searchQuery.setGetTotalCount(true); // Set this to return the total number of matched rows.

    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
    // Use the columnsToGet parameter to specify the columns to return or to return all columns. If you do not set this parameter, only the primary key columns are returned by default.
    //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    //columnsToGet.setReturnAll(true); // Set this to return all columns.
    //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // Set this to return specified columns.
    //searchRequest.setColumnsToGet(columnsToGet);

    SearchResponse resp = client.search(searchRequest);
    //System.out.println("TotalCount: " + resp.getTotalCount()); // Print the total number of matched rows, not the number of returned rows.
    System.out.println("Row: " + resp.getRows());
}

Exemple de requête imbriquée à plusieurs niveaux

Cet exemple montre comment rechercher les données où col_nested.nested_2.nested_2_2 correspond à tablestore. Le champ col_nested est un champ imbriqué dont les lignes enfants incluent les colonnes nested_1 et nested_2. La colonne nested_2 constitue elle-même un champ imbriqué contenant les colonnes nested_2_1 et nested_2_2 dans ses lignes enfants.

private static void nestedQuery(SyncClient client) {
    SearchQuery searchQuery = new SearchQuery();
    NestedQuery nestedQuery = new NestedQuery(); // Set the query type to NestedQuery.
    nestedQuery.setPath("col_nested.nested_2"); // Set the path of the nested column, which is the parent path of the field to query.
    TermQuery termQuery = new TermQuery(); // Construct the subquery for NestedQuery.
    termQuery.setFieldName("col_nested.nested_2.nested_2_2"); // Set the column name, which is the full path of the field to query.
    termQuery.setTerm(ColumnValue.fromString("tablestore")); // Set the value to query.
    nestedQuery.setQuery(termQuery);
    nestedQuery.setScoreMode(ScoreMode.None);
    searchQuery.setQuery(nestedQuery);
    //searchQuery.setGetTotalCount(true); // Set this to return the total number of matched rows.

    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
    // Use the columnsToGet parameter to specify the columns to return or to return all columns. If you do not set this parameter, only the primary key columns are returned by default.
    //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    //columnsToGet.setReturnAll(true); // Set this to return all columns.
    //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // Set this to return specified columns.
    //searchRequest.setColumnsToGet(columnsToGet);

    SearchResponse resp = client.search(searchRequest);
    //System.out.println("TotalCount: " + resp.getTotalCount()); // Print the total number of matched rows, not the number of returned rows.
    System.out.println("Row: " + resp.getRows());
}

Exemple de requête imbriquée composite

Besoins de la requête

Imaginons une table de données dotée de deux colonnes : col_string (String) et col_nested (String). La colonne col_nested stocke des données au format JSON. Le tableau suivant présente un échantillon de ces données.

Remarque

Une colonne indiquant le numéro de ligne a été ajoutée à des fins d'illustration.

Numéro de ligne

col_string

col_nested

1

a

[{"col_keyword": "tablestore"},{"col_keyword": "searchindex","col_long": 1}]

2

b

[{"col_keyword": "tablestore","col_long": 1}]

3

c

[{"col_keyword": "searchindex"},{"col_long": 1}]

Supposons que vous deviez appliquer les critères de recherche suivants aux données de la colonne col_nested :

  • Une seule ligne enfant satisfait plusieurs conditions de requête

    Vous pouvez par exemple rechercher les lignes où une unique ligne enfant de la colonne col_nested remplit simultanément deux conditions : la valeur de la colonne col_keyword est tablestore et celle de la colonne col_long n'est pas vide.

  • Différentes lignes enfants satisfont plusieurs conditions de requête

    Il est aussi possible de rechercher les lignes où une première ligne enfant de la colonne col_nested possède la valeur tablestore pour col_keyword, tandis qu'une seconde ligne enfant présente une valeur non vide pour col_long.

Pour répondre à ces exigences, procédez comme suit :

  1. Créez un index de recherche pour la table de données et définissez la colonne col_nested comme étant de type imbriqué dans cet index.

    Cette colonne comprend deux sous-champs : col_keyword (Keyword) et col_long (Long).

  2. Adoptez la méthode de requête adaptée à votre scénario.

    • Si une seule ligne enfant doit satisfaire plusieurs conditions, configurez plusieurs objets BoolQuery au sein d'un même NestedQuery.

    • Lorsque différentes lignes enfants doivent remplir des critères distincts, définissez plusieurs conditions NestedQuery sous un même BoolQuery.

Les exemples ci-dessous détaillent la procédure d'interrogation des données. Reportez-vous à celui qui correspond à votre cas d'usage.

Exemple de requête où une seule ligne enfant satisfait plusieurs conditions

L'exemple suivant montre comment extraire les lignes où une même ligne enfant de la colonne col_nested vérifie deux critères : `col_nested.col_keyword vaut « tablestore » et `col_nested.col_long n'est pas vide.

D'après les données d'exemple, seule la ligne 2 répond à ces critères.

public static void nestedQuery(SyncClient client) {
    // Condition 1: The value of the col_keyword column in the child row of col_nested must be "tablestore".
    TermQuery termQuery = new TermQuery();
    termQuery.setFieldName("col_nested.col_keyword");
    termQuery.setTerm(ColumnValue.fromString("tablestore"));

    // Condition 2: The col_long column in the child row of col_nested must not be empty.
    ExistsQuery existsQuery = new ExistsQuery();
    existsQuery.setFieldName("col_nested.col_long");

    // Use the AND condition of BoolQuery to query for child rows that meet both conditions.
    List<Query> mustQueries = new ArrayList<>();
    mustQueries.add(termQuery);
    mustQueries.add(existsQuery);
    BoolQuery boolQuery = new BoolQuery();
    boolQuery.setMustQueries(mustQueries);

    // Set a BoolQuery within the NestedQuery to require a child row to meet multiple query conditions at the same time.
    NestedQuery nestedQuery = new NestedQuery();    // Set the query type to NestedQuery.
    nestedQuery.setPath("col_nested");   // Set the path of the nested column, which is the parent path of the field to query.
    nestedQuery.setQuery(boolQuery);
    nestedQuery.setScoreMode(ScoreMode.None);

    SearchQuery searchQuery = new SearchQuery();
    searchQuery.setQuery(nestedQuery);

    SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
    // Use the columnsToGet parameter to specify the columns to return or to return all columns. If you do not set this parameter, only the primary key columns are returned by default.
    //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
    //columnsToGet.setReturnAll(true); // Set this to return all columns.
    //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // Set this to return specified columns.
    //searchRequest.setColumnsToGet(columnsToGet);

    SearchResponse resp = client.search(searchRequest);
    //System.out.println("TotalCount: " + resp.getTotalCount()); // Print the total number of matched rows, not the number of returned rows.
    System.out.println("Row: " + resp.getRows());
}

Exemple de requête où différentes lignes enfants satisfont plusieurs conditions

Cet exemple recherche les lignes dont les objets imbriqués du champ col_nested remplissent deux conditions : col_nested.col_keyword vaut « tablestore » et col_nested.col_long n'est pas vide.

Selon les données d'exemple, les lignes 1 et 2 correspondent à ces critères.

public static void nestedQuery(SyncClient client) {
        // Condition 1: The value of the col_keyword column in the child row of col_nested must be "tablestore".
        TermQuery termQuery = new TermQuery();
        termQuery.setFieldName("col_nested.col_keyword");
        termQuery.setTerm(ColumnValue.fromString("tablestore"));
        NestedQuery nestedTermQuery = new NestedQuery();
        nestedTermQuery.setPath("col_nested");
        nestedTermQuery.setScoreMode(ScoreMode.None);
        nestedTermQuery.setQuery(termQuery);

        // Condition 2: The col_long column in the child row of col_nested must not be empty.
        ExistsQuery existsQuery = new ExistsQuery();
        existsQuery.setFieldName("col_nested.col_long");
        NestedQuery nestedExistsQuery = new NestedQuery();
        nestedExistsQuery.setPath("col_nested");
        nestedExistsQuery.setScoreMode(ScoreMode.None);
        nestedExistsQuery.setQuery(existsQuery);

        // Use the AND condition of BoolQuery to query for rows that meet the preceding conditions.
        List<Query> mustQueries = new ArrayList<>();
        mustQueries.add(nestedTermQuery);
        mustQueries.add(nestedExistsQuery);

        // The BoolQuery includes multiple NestedQuery conditions. The query is successful if different child rows meet the respective query conditions.
        BoolQuery boolQuery = new BoolQuery();
        boolQuery.setMustQueries(mustQueries);

        SearchQuery searchQuery = new SearchQuery();
        searchQuery.setQuery(boolQuery);

        SearchRequest searchRequest = new SearchRequest("<TABLE_NAME>", "<SEARCH_INDEX_NAME>", searchQuery);
        // Use the columnsToGet parameter to specify the columns to return or to return all columns. If you do not set this parameter, only the primary key columns are returned by default.
        //SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
        //columnsToGet.setReturnAll(true); // Set this to return all columns.
        //columnsToGet.setColumns(Arrays.asList("ColName1","ColName2")); // Set this to return specified columns.
        //searchRequest.setColumnsToGet(columnsToGet);

        SearchResponse resp = client.search(searchRequest);
        //System.out.println("TotalCount: " + resp.getTotalCount()); // Print the total number of matched rows, not the number of returned rows.
        System.out.println("Row: " + resp.getRows());
    }

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

L'exemple ci-dessous démontre comment utiliser NestedQuery pour rechercher les données où le sous-champ Level1_Col1_Nested du champ imbriqué Col_Nested correspond à `hangzhou shanghai`. Le terme recherché apparaît en surbrillance dans les résultats renvoyés.

/**
 * Use summary and highlighting in a NestedQuery. Set parameters using innerHits.
 */
public static void nestedQueryWithHighlighting(SyncClient client) {
        SearchRequest searchRequest = SearchRequest.newBuilder()
                .tableName("<TABLE_NAME>")
                .indexName("<SEARCH_INDEX_NAME>")
                .returnAllColumnsFromIndex(true)
                .searchQuery(SearchQuery.newBuilder()
                        .limit(5)
                        .query(QueryBuilders.nested()
                                .path("Col_Nested")
                                .scoreMode(ScoreMode.Min)
                                .query(QueryBuilders.match("Col_Nested.Level1_Col1_Nested", "hangzhou shanghai"))
                                .innerHits(InnerHits.newBuilder()
                                        .highlight(Highlight.newBuilder()
                                                .addFieldHighlightParam("Col_Nested.Level1_Col1_Nested", HighlightParameter.newBuilder().build())
                                                .build())
                                        .build()))
                        .build())
                .build();
        SearchResponse resp = client.search(searchRequest);

        // Print the highlighted results.
        printSearchHit(resp.getSearchHits(), "");
}

/**
 * Print the content of searchHit.
 * @param searchHits The search hits.
 * @param prefix The prefix to add when printing nested structures to show hierarchical information.
 */
private static void printSearchHit(List<SearchHit> searchHits, String prefix) {
    for (SearchHit searchHit : searchHits) {
        if (searchHit.getScore() != null) {
            System.out.printf("%s Score: %s\n", prefix, searchHit.getScore());
        }

        if (searchHit.getOffset() != null) {
            System.out.printf("%s Offset: %s\n", prefix, searchHit.getOffset());
        }

        if (searchHit.getRow() != null) {
            System.out.printf("%s Row: %s\n", prefix, searchHit.getRow().toString());
        }

        // Print the highlighted fragments for each field.
        if (searchHit.getHighlightResultItem() != null) {
            System.out.printf("%s Highlight: \n", prefix);
            StringBuilder strBuilder = new StringBuilder();
            for (Map.Entry<String, HighlightField> entry : searchHit.getHighlightResultItem().getHighlightFields().entrySet()) {
                strBuilder.append(entry.getKey()).append(":").append("[");
                strBuilder.append(StringUtils.join(",", entry.getValue().getFragments())).append("]\n");
            }
            System.out.printf("%s   %s", prefix, strBuilder);
        }

        // Highlighted results for the nested type.
        for (SearchInnerHit searchInnerHit : searchHit.getSearchInnerHits().values()) {
            System.out.printf("%s Path: %s\n", prefix, searchInnerHit.getPath());
            System.out.printf("%s InnerHit: \n", prefix);
            printSearchHit(searchInnerHit.getSubSearchHits(), prefix + "    ");
        }

        System.out.println();
    }
}

Supposons que le champ imbriqué à plusieurs niveaux Col_Nested comprenne deux sous-champs : Level1_Col1_Text (Text) et Level1_Col2_Nested (Nested). Ce dernier contient lui-même le sous-champ Level2_Col1_Text.

L'exemple suivant explique comment intégrer un BoolQuery dans un NestedQuery afin d'appliquer les fonctions de résumé et de mise en surbrillance à la fois au sous-champ Level1_Col1_Text du champ Col_Nested et au sous-champ Level2_Col1_Text situé sous Level1_Col2_Nested.

public static void nestedQueryWithHighlighting(SyncClient client) {
    SearchRequest searchRequest = SearchRequest.newBuilder()
            .tableName("<TABLE_NAME>")
            .indexName("<SEARCH_INDEX_NAME>")
            .returnAllColumnsFromIndex(true)
            .searchQuery(SearchQuery.newBuilder()
                    .limit(5)
                    .query(QueryBuilders.nested()
                            .path("Col_Nested")
                            .scoreMode(ScoreMode.Min)
                            .query(QueryBuilders.bool()
                                    .should(QueryBuilders.match("Col_Nested.Level1_Col1_Text", "hangzhou shanghai"))
                                    .should(QueryBuilders.nested()
                                            .path("Col_Nested.Level1_Col2_Nested")
                                            .scoreMode(ScoreMode.Min)
                                            .query(QueryBuilders.match("Col_Nested.Level1_Col2_Nested.Level2_Col1_Text", "hangzhou shanghai"))
                                            .innerHits(InnerHits.newBuilder()
                                                    .highlight(Highlight.newBuilder()
                                                            .addFieldHighlightParam("Col_Nested.Level1_Col2_Nested.Level2_Col1_Text", HighlightParameter.newBuilder().build())
                                                            .build())
                                                    .build())))
                            .innerHits(InnerHits.newBuilder()
                                    .sort(new Sort(Arrays.asList(
                                            new ScoreSort(),
                                            new DocSort()
                                    )))
                                    .highlight(Highlight.newBuilder()
                                            .addFieldHighlightParam("Col_Nested.Level1_Col1_Text", HighlightParameter.newBuilder().build())
                                            .build())
                                    .build()))
                    .build())
            .build();
    SearchResponse resp = client.search(searchRequest);
    // Print the highlighted results.
    printSearchHit(resp.getSearchHits(), "");
}

/**
 * Print the content of searchHit.
 * @param searchHits The search hits.
 * @param prefix The prefix to add when printing nested structures to show hierarchical information.
 */
private static void printSearchHit(List<SearchHit> searchHits, String prefix) {
    for (SearchHit searchHit : searchHits) {
        if (searchHit.getScore() != null) {
            System.out.printf("%s Score: %s\n", prefix, searchHit.getScore());
        }

        if (searchHit.getOffset() != null) {
            System.out.printf("%s Offset: %s\n", prefix, searchHit.getOffset());
        }

        if (searchHit.getRow() != null) {
            System.out.printf("%s Row: %s\n", prefix, searchHit.getRow().toString());
        }

        // Print the highlighted fragments for each field.
        if (searchHit.getHighlightResultItem() != null) {
            System.out.printf("%s Highlight: \n", prefix);
            StringBuilder strBuilder = new StringBuilder();
            for (Map.Entry<String, HighlightField> entry : searchHit.getHighlightResultItem().getHighlightFields().entrySet()) {
                strBuilder.append(entry.getKey()).append(":").append("[");
                strBuilder.append(StringUtils.join(",", entry.getValue().getFragments())).append("]\n");
            }
            System.out.printf("%s   %s", prefix, strBuilder);
        }

        // Highlighted results for the nested type.
        for (SearchInnerHit searchInnerHit : searchHit.getSearchInnerHits().values()) {
            System.out.printf("%s Path: %s\n", prefix, searchInnerHit.getPath());
            System.out.printf("%s InnerHit: \n", prefix);
            printSearchHit(searchInnerHit.getSubSearchHits(), prefix + "    ");
        }

        System.out.println();
    }
}

Facturation

L'interrogation de données via un Search Index consomme du débit en lecture. Pour plus d'informations, reportez-vous à Mesure et facturation de Search Index.

FAQ

Références