Para usar la función de resumen y resaltado, debe habilitar el resaltado en un campo Text al crear un search index. Después, configure los parámetros de resaltado en su consulta para devolver fragmentos que contengan las consultas coincidentes y resaltar los términos encontrados.
Escenarios
La función de resumen y resaltado extrae fragmentos cercanos a las consultas coincidentes y resalta dichas consultas. Esta función es útil en escenarios de búsqueda de texto completo, como búsquedas web, recuperación de registros de chat y búsquedas en documentos.
Descripción general de la función
La función de resumen y resaltado destaca el texto de los resultados de búsqueda que coincide con sus consultas o se relaciona con ellas. Esto ayuda a los usuarios a encontrar contenido relevante rápidamente y mejora la eficiencia en la recuperación de información. También es compatible con estructuras de datos complejas que contienen tipos anidados, como JSON, para localizar la información con precisión. De forma predeterminada, Tablestore usa las etiquetas <em></em> para marcar las consultas coincidentes.
Para usar la función de resumen y resaltado, aplique la siguiente configuración:
-
Al crear un search index, establezca el parámetro enableHighlighting en True para el campo Text. Para obtener más información, consulte Create a search index.
ImportanteSolo puede habilitar la función de resumen y resaltado en campos Text.
Al consultar datos, personalice el estilo de resaltado mediante la especificación de parámetros. Entre ellos se incluyen el método de codificación de los fragmentos resaltados, el número máximo de fragmentos por devolver y las etiquetas de apertura y cierre.
Suponga que habilitó la función de resumen y resaltado para un campo Text cuando creó un search index. Si el valor del campo Text es query highlight test, utilice una consulta match phrase para la palabra clave highlight. Una vez que especifique los parámetros de resaltado, se devuelve el fragmento resaltado query <em>highlight</em> test.
Notas
Cuando usa la función de resumen y resaltado con MatchQuery o MatchPhraseQuery, los términos coincidentes pueden quedar resaltados con varias etiquetas de apertura y cierre.
Si el tipo de tokenizer del campo Text es segmentación semántica máxima, la función de resumen y resaltado no es compatible con consultas MatchPhraseQuery.
La división de fragmentos puede separar un término coincidente dentro del texto. En ese caso, es posible que el término no se resalte.
API
La función de resumen y resaltado utiliza la API Search. Los tipos de consulta compatibles son TermQuery, TermsQuery, MatchQuery, MatchPhraseQuery, PrefixQuery, WildcardQuery y NestedQuery.
Parámetros
Al usar la función de resumen y resaltado, configure los parámetros de resaltado mediante el parámetro Highlight. Para las subcolumnas de un tipo anidado, establezca estos parámetros con InnerHits.
Parámetros de Highlight
|
Nombre |
Tipo |
Descripción |
|
fieldHighlightParams (obligatorio) |
|
Nombres de los campos y configuración de fragmentos. La clave es el nombre del campo cuyos resultados de resumen y resaltado desea devolver. Su valor es el objeto |
|
highlightEncoder (opcional) |
HighlightEncoder |
Método de codificación del texto original en los fragmentos resaltados. Valores válidos:
|
|
fieldHighlightParams[].numberOfFragments (opcional) |
Integer |
Número máximo de fragmentos resaltados que se devuelven para un campo. Se recomienda establecer este parámetro en |
|
fieldHighlightParams[].fragmentSize (opcional) |
Integer |
Longitud objetivo de cada fragmento. El valor predeterminado es |
|
fieldHighlightParams[].preTag (opcional) |
String |
Etiqueta de apertura para un término coincidente. El valor predeterminado es |
|
fieldHighlightParams[].postTag (opcional) |
String |
Etiqueta de cierre para un término coincidente. El valor predeterminado es |
|
fieldHighlightParams[].highlightFragmentOrder (opcional) |
HighlightFragmentOrder |
Orden en el que se devuelven varios fragmentos resaltados. |
Parámetros de InnerHits
|
Parámetro |
Descripción |
|
sort |
Regla de ordenación de las subfilas anidadas devueltas. |
|
offset |
Posición inicial desde la cual se devuelven las subfilas cuando una columna anidada contiene varias de ellas. |
|
limit |
Número de subfilas que se devuelven cuando una columna anidada contiene varias de ellas. Valor predeterminado: 3. |
|
highlight |
Configuración de los parámetros de resaltado para las subcolumnas anidadas. Para obtener más información sobre esta configuración, consulte Highlight parameters. |
Uso
La función de resumen y resaltado solo se puede utilizar mediante un SDK.
Antes de ejecutar una consulta de resaltado, complete los siguientes preparativos:
-
Debe contar con una cuenta de Alibaba Cloud o un usuario de RAM que tenga permisos para operar en Tablestore. Para otorgar estos permisos a un usuario de RAM, consulte Grant permissions to a RAM user using a RAM policy.
Si utiliza un SDK y no dispone de un AccessKey válido, cree uno para su cuenta de Alibaba Cloud o usuario de RAM. Para obtener más información, consulte Create an AccessKey.
Se debe haber creado una tabla de datos. Para obtener más información, consulte Data table operations.
Cree un search index para la tabla de datos y habilite el resaltado en el campo especificado. Para obtener más información, consulte Create a search index.
Cuando use un SDK, inicialice el cliente de Tablestore. Para obtener más información, consulte Initialize Tablestore Client.
Puede combinar la función de resumen y resaltado con Java SDK, Go SDK, Python SDK y Node.js SDK. A continuación se muestran ejemplos de uso con el SDK de Java.
Uso del resumen y resaltado de consultas en campos no anidados
El siguiente ejemplo utiliza una consulta match para recuperar las filas donde el campo description contiene el término tablestore. Además, encierra los términos coincidentes de los fragmentos devueltos entre <b> y </b>. El campo description es un campo Text que tiene habilitado el resumen y resaltado.
String tableName = "example_table";
String indexName = "example_index";
MatchQuery matchQuery = new MatchQuery();
matchQuery.setFieldName("description");
matchQuery.setText("tablestore");
HighlightParameter highlightParameter = new HighlightParameter();
highlightParameter.setPreTag("<b>");
highlightParameter.setPostTag("</b>");
Highlight highlight = new Highlight();
highlight.addFieldHighlightParam("description", highlightParameter);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(matchQuery);
searchQuery.setHighlight(highlight);
searchQuery.setLimit(10);
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchResponse response = client.search(request);
for (SearchHit hit : response.getSearchHits()) {
HighlightResultItem resultItem = hit.getHighlightResultItem();
if (resultItem == null) {
continue;
}
HighlightField field = resultItem.getHighlightFieldByName("description");
if (field != null) {
System.out.println(field.getFragments());
}
}
Uso del resaltado al consultar campos anidados
En el siguiente ejemplo se muestra cómo usar NestedQuery para buscar datos donde el valor del subcampo Level1_Col1_Nested, dentro del campo anidado Col_Nested, coincida con `hangzhou shanghai`. La consulta de búsqueda se resalta en los resultados devueltos.
MatchQuery matchQuery = new MatchQuery();
matchQuery.setFieldName("items.description");
matchQuery.setText("hangzhou");
HighlightParameter parameter = new HighlightParameter();
parameter.setPreTag("<em>");
parameter.setPostTag("</em>");
Highlight highlight = new Highlight();
highlight.addFieldHighlightParam("items.description", parameter);
InnerHits innerHits = new InnerHits();
innerHits.setLimit(3);
innerHits.setSort(new Sort(Arrays.asList(
new ScoreSort(), new DocSort(SortOrder.ASC))));
innerHits.setHighlight(highlight);
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("items");
nestedQuery.setQuery(matchQuery);
nestedQuery.setScoreMode(ScoreMode.None);
nestedQuery.setInnerHits(innerHits);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);
Suponga que el campo anidado multinivel Col_Nested incluye dos subcampos: Level1_Col1_Text (Text) y Level1_Col2_Nested (Nested). El campo anidado Level1_Col2_Nested contiene el subcampo Level2_Col1_Text.
En el siguiente ejemplo se muestra cómo agregar un BoolQuery a un NestedQuery para aplicar las funciones de resumen y resaltado tanto en el subcampo Level1_Col1_Text del campo Col_Nested como en el subcampo Level2_Col1_Text bajo 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 ", prefix, searchHit.getScore()); } if (searchHit.getOffset() != null) { System.out.printf("%s Offset: %s ", prefix, searchHit.getOffset()); } if (searchHit.getRow() != null) { System.out.printf("%s Row: %s ", prefix, searchHit.getRow().toString()); } // Print the highlighted fragments for each field. if (searchHit.getHighlightResultItem() != null) { System.out.printf("%s Highlight: ", 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("] "); } 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 ", prefix, searchInnerHit.getPath()); System.out.printf("%s InnerHit: ", prefix); printSearchHit(searchInnerHit.getSubSearchHits(), prefix + " "); } System.out.println(); } }
Facturación
El uso de la función de resumen y resaltado durante las consultas de datos no afecta las reglas de facturación existentes.
Al consultar datos mediante un search index, se consume capacidad de lectura. Para obtener más información, consulte Search index metering and billing.
Preguntas frecuentes
Referencias
Search Index admite diversos tipos de consulta para buscar datos multidimensionales, entre ellos term query, terms query, match all query, match query, phrase match query, range query, prefix query, suffix query, wildcard query, token-based wildcard query, boolean query, geo query, nested query, vector search, y exists query.
Al consultar datos, puede sort and paginate el conjunto de resultados o ejecutar collapsing (deduplication).
Para analizar datos, como buscar el valor máximo o mínimo, calcular una suma o contar filas, utilice las funciones statistical aggregation o SQL query.
Si necesita exportar datos rápidamente sin importar el orden del conjunto de resultados, utilice la función Parallel Scan.