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:
-
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.
ImportanteAtive o recurso de destaque apenas para campos Text.
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:
|
|
|
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 |
|
|
postTag |
Tag de sufixo para destacar a consulta de busca, como |
|
|
highlightFragmentOrder |
Regra de ordenação dos fragmentos quando um campo destacado retorna múltiplos resultados.
|
|
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
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:
-
Crie uma conta Alibaba Cloud ou um usuário RAM com permissões de operação no Tablestore. Para saber como conceder permissões de operação do Tablestore a um usuário RAM, consulte Usar uma política RAM para conceder permissões a um usuário RAM.
Para usar o recurso de destaque via SDKs do Tablestore, crie um par de AccessKey para sua conta Alibaba Cloud ou usuário RAM. Para mais informações, consulte Criar um par de AccessKey.
Crie uma tabela de dados. Para mais informações, consulte Operações em uma tabela de dados.
Crie um índice de busca para a tabela de dados e ative o recurso de destaque para um campo específico. Para mais informações, consulte Criar um índice de busca.
Para usar o recurso de destaque via SDKs do Tablestore, inicialize uma instância OTSClient. Para mais informações, consulte Inicializar uma instância OTSClient.
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
O Índice de Busca suporta diversos tipos de consulta para dados multidimensionais, incluindo consulta de termo, consulta de termos, consulta match all, consulta match, consulta de frase correspondente, consulta de intervalo, consulta de prefixo, consulta de sufixo, consulta curinga, consulta curinga baseada em token, consulta booleana, consulta geográfica, consulta aninhada, busca vetorial e consulta exists.
Durante a consulta de dados, aplique ordenação e paginação no conjunto de resultados ou execute colapso (deduplicação).
Para análise de dados, como encontrar valores máximos ou mínimos, calcular somas ou contar linhas, use os recursos de agregação estatística ou consulta SQL.
Para exportar dados rapidamente, independentemente da ordem do conjunto de resultados, use o recurso Parallel Scan.