Todos os produtos
Search
Central de documentação

Tablestore:Destaque

Última atualização: Jun 30, 2026

Ao criar um índice de busca, ative o recurso de destaque para um campo Text. Assim, ao consultar dados com base nesse campo, configure os parâmetros de destaque para realçar as strings de consulta nos segmentos das linhas correspondentes.

Cenários

O recurso de destaque em buscas de texto integral realça as strings de consulta nos segmentos das linhas correspondentes. Essa funcionalidade é ideal para pesquisa na web, recuperação de histórico de chat e busca em documentos.

Visão geral do recurso

Use o recurso de destaque para evidenciar o texto correspondente ou relacionado às strings de consulta nos resultados. Isso melhora a eficiência da recuperação de informações e permite localizar rapidamente os termos buscados. O destaque também facilita a localização precisa de informações em dados aninhados com estruturas complexas, como JSON. Por padrão, o Tablestore usa <em></em> para destacar as strings de consulta nos resultados.

Para usar o recurso de destaque, realize as seguintes configurações:

  1. Ao criar um índice de busca, defina o parâmetro enableHighlighting como True para um campo Text. Para mais informações, consulte Criar um índice de busca.

    Importante

    Ative o recurso de destaque apenas para campos Text.

  2. Em uma solicitação de consulta com destaque, especifique um estilo personalizado configurando parâmetros como o método de codificação dos fragmentos de texto destacados, o número máximo de fragmentos a retornar por linha, a tag de abertura e a tag de fechamento.

Por exemplo, suponha que você tenha ativado o destaque para um campo Text ao criar um índice de busca. Se executar uma consulta de frase correspondente (MatchPhraseQuery) buscando a string West Lake nesse campo e configurar os parâmetros de destaque, uma linha com o valor Hangzhou West Lake Scenic Area atenderá às condições. O segmento de texto retornado será destacado como Hangzhou <em>West Lake</em> Scenic Area.

Observações de uso

  • Em consultas de correspondência (MatchQuery) ou de frase correspondente (MatchPhraseQuery) com destaque ativado, as strings de consulta nos resultados podem ser destacadas usando múltiplas tags de abertura (preTag) e fechamento (postTag).

  • Se o método de tokenização de um campo Text for baseado na unidade semântica máxima (MaxWord), o recurso de destaque não terá suporte durante consultas de frase correspondente nesse campo.

  • Ao retornar múltiplos fragmentos, as strings de consulta podem ser divididas entre eles. Nesse caso, o destaque das strings pode não ocorrer corretamente.

Operação de API

Para usar o recurso de destaque, chame a operação Search e defina o tipo de consulta como TermQuery, TermsQuery, MatchQuery, MatchPhraseQuery, PrefixQuery, WildcardQuery ou NestedQuery.

Parâmetros

Geralmente, configure os parâmetros Highlight para usar o recurso de destaque. Para subcampos de um campo aninhado, configure os parâmetros InnerHits.

Parâmetros de Highlight

Parameter

Description

highlightEncoder

Método de codificação para o conteúdo original do fragmento destacado. Valores válidos:

  • PLAIN (padrão): Exibe o conteúdo original sem codificação.

  • HTML: Aplica escape HTML ao conteúdo original do fragmento destacado. Por exemplo, < torna-se &lt;, > torna-se &gt;, " torna-se &quot;, ' torna-se &#x27; e / torna-se &#x2F;. Use este formato para exibição na web.

fieldHighlightParams

Parâmetros de destaque para um campo específico. Configure este parâmetro apenas para campos incluídos em uma consulta de palavra-chave no SearchQuery.

HighlightParameter

numberOfFragments

Número máximo de fragmentos destacados a retornar. Defina este parâmetro como 1.

fragmentSize

Comprimento de cada fragmento. O valor padrão é 100.

Importante

O comprimento real do fragmento retornado pode não ser exatamente igual a este valor.

preTag

Tag de prefixo para destacar a consulta de busca, como <em> ou <b>. O valor padrão é <em>. Personalize a tag de prefixo conforme necessário. Os caracteres suportados para preTag incluem < > " ' /, a-z, A-Z e 0-9.

postTag

Tag de sufixo para destacar a consulta de busca, como </em> ou </b>. O valor padrão é </em>. Personalize a tag de sufixo conforme necessário. Os caracteres suportados para postTag incluem < > " ' /, a-z, A-Z e 0-9.

highlightFragmentOrder

Regra de ordenação dos fragmentos quando um campo destacado retorna múltiplos resultados.

  • TEXT_SEQUENCE (padrão): Segue a ordem em que os fragmentos aparecem no texto original.

  • SCORE: Ordena os fragmentos com base nas pontuações das ocorrências da consulta.

Parâmetros de InnerHits

Parameter

Description

sort

Regra de ordenação para as linhas filhas do campo aninhado.

offset

Posição inicial das linhas filhas a retornar, caso o campo aninhado contenha múltiplas linhas filhas.

limit

Número máximo de linhas filhas a retornar, caso o campo aninhado contenha múltiplas linhas filhas. Valor padrão: 3.

highlight

Configurações de destaque para os subcampos do campo aninhado. Para mais informações, consulte Parâmetros de Highlight.

Métodos

Importante

Use o recurso de destaque exclusivamente por meio dos SDKs do Tablestore.

Antes de usar o recurso de destaque, certifique-se de cumprir os seguintes pré-requisitos:

Use os seguintes SDKs do Tablestore para implementar o recurso de destaque: Tablestore SDK for Java, Tablestore SDK for Go, Tablestore SDK for Python e Tablestore SDK for Node.js. Este exemplo utiliza o Tablestore SDK for Java.

Usar o recurso de destaque em consultas de campos não aninhados

O exemplo abaixo demonstra como usar MatchQuery para encontrar dados onde a coluna Col_Text corresponde a hangzhou shanghai e como destacar a consulta nos resultados. A coluna Col_Text é do tipo Text.

/**
 * Use MatchQuery with summary and highlighting.
 */
public static void matchQueryWithHighlighting(SyncClient client) {
    SearchRequest searchRequest = SearchRequest.newBuilder()
            .tableName("<TABLE_NAME>")
            .indexName("<SEARCH_INDEX_NAME>")
            .returnAllColumnsFromIndex(true)
            .searchQuery(SearchQuery.newBuilder()
                    .limit(5)
                    .query(QueryBuilders.bool()
                            .should(QueryBuilders.match("Col_Text", "hangzhou shanghai")))
                    .highlight(Highlight.newBuilder()
                            .addFieldHighlightParam("Col_Text", HighlightParameter.newBuilder()
                                    .highlightFragmentOrder(HighlightFragmentOrder.TEXT_SEQUENCE)
                                    .preTag("")
                                    .postTag("")
                                    .build())
                            .build())
                    .build())
            .build();
    SearchResponse resp = client.search(searchRequest);

    // Print the query and highlighting results. Set the prefix to an empty string when you query non-nested fields.
    printSearchHit(resp.getSearchHits(), "");
}

/**
 * Prints the content of searchHit.
 * @param searchHits The search hits.
 * @param prefix The prefix to add for nested structures to display 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 fragment results 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);
        }

        System.out.println();
    }
}

Usar o recurso de destaque em consultas de campos aninhados

O exemplo a seguir mostra como usar NestedQuery para buscar dados onde o valor do subcampo Level1_Col1_Nested no campo aninhado Col_Nested corresponde a `hangzhou shanghai`. A consulta de busca é destacada nos resultados retornados.

/**
 * 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();
    }
}

Considere que o campo aninhado multinível Col_Nested inclua dois subcampos: Level1_Col1_Text (Text) e Level1_Col2_Nested (Nested). O campo aninhado Level1_Col2_Nested inclui o subcampo Level2_Col1_Text.

O exemplo abaixo ilustra como adicionar um BoolQuery a um NestedQuery para aplicar os recursos de resumo e destaque tanto no subcampo Level1_Col1_Text do campo Col_Nested quanto no subcampo Level2_Col1_Text dentro de 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();
    }
}

Regras de faturamento

O uso do recurso de destaque durante consultas de dados não altera as regras de faturamento existentes do Tablestore.

Ao usar um índice de busca para consultar dados, há cobrança pelo throughput de leitura consumido. Para mais informações, consulte Itens faturáveis de índices de busca.

Perguntas frequentes

Referências