Una consulta anidada con el Tablestore SDK for Java busca coincidencias en un campo Nested y conserva los límites de las filas secundarias, lo que permite devolver dichas filas coincidentes.
Requisitos previos
Instale Tablestore SDK for Java e inicialice un cliente.
Descripción de la función
Una consulta anidada busca filas secundarias dentro de un campo Nested. Cada fila secundaria en un campo Nested conserva de forma independiente las relaciones entre sus campos. No es posible consultar directamente los subcampos de un campo Nested; en su lugar, debe envolver la subconsulta en un objeto NestedQuery.
NestedQuery.path especifica la ruta del campo anidado que se va a consultar. Los nombres de los campos en la subconsulta deben usar rutas completas. La subconsulta puede ser de cualquier tipo Query. Para consultar un campo anidado de varios niveles, establezca path directamente con la ruta completa del campo anidado objetivo o anide objetos NestedQuery para consultar cada nivel.
El hecho de que una misma fila secundaria deba cumplir varias condiciones depende de cómo se combinen NestedQuery y BoolQuery:
Para exigir que la misma fila secundaria cumpla varias condiciones, configure un
BoolQueryque contenga las condiciones secundarias como subconsulta de un únicoNestedQuery.Para permitir que distintas filas secundarias cumplan las condiciones por separado, cree un
NestedQuerypara cada condición y combine las consultas anidadas en unBoolQueryexterno.
Llame a search para ejecutar una consulta anidada. En la condición de consulta, especifique la ruta del campo anidado, la subconsulta y el modo de puntuación.
SearchResponse search(SearchRequest request)
El siguiente ejemplo consulta filas secundarias en el campo anidado items cuyo campo items.keyword es igual a tablestore. La consulta devuelve hasta 10 filas y el número total de coincidencias.
String tableName = "example_table";
String indexName = "example_index";
TermQuery termQuery = new TermQuery();
termQuery.setFieldName("items.keyword");
termQuery.setTerm(ColumnValue.fromString("tablestore"));
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("items");
nestedQuery.setQuery(termQuery);
nestedQuery.setScoreMode(ScoreMode.None);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);
searchQuery.setLimit(10);
searchQuery.setTrackTotalCount(SearchQuery.TRACK_TOTAL_COUNT);
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchResponse response = client.search(request);
System.out.println(response.getTotalCount());
System.out.println(response.getRows());
Parámetros
Solicitud de búsqueda
request es un objeto SearchRequest que contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
tableName (obligatorio) |
String |
El nombre de la tabla de datos. |
|
indexName (obligatorio) |
String |
El nombre del índice de búsqueda. |
|
searchQuery (obligatorio) |
SearchQuery |
La condición de consulta y la configuración general de la consulta. |
|
columnsToGet (opcional) |
SearchRequest.ColumnsToGet |
Las columnas que se van a devolver. Si no se configura este parámetro, solo se devuelven las columnas de clave principal. |
|
timeoutInMillisecond (opcional) |
int |
El tiempo de espera de la consulta a nivel de solicitud, en milisegundos. El valor predeterminado es |
|
routingValues (opcional) |
|
Los valores de clave principal que corresponden a campos de enrutamiento personalizados. Deje este parámetro sin configurar si no hay enrutamiento personalizado. |
Configuración de la consulta
request.searchQuery es un objeto SearchQuery que contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
query (obligatorio) |
Query |
La condición de consulta. Establezca este parámetro con un objeto |
|
offset (opcional) |
Integer |
La posición inicial de la consulta. |
|
limit (opcional) |
Integer |
El número máximo de filas que se van a devolver. Establezca este parámetro en |
|
collapse (opcional) |
Collapse |
La configuración de colapso de campos, que deduplica los resultados según un campo específico. Para más detalles sobre la configuración, consulte Collapse query results. |
|
sort (opcional) |
Sort |
El orden de clasificación de los resultados. Para más detalles sobre la configuración, consulte Sort and paginate results. |
|
trackTotalCount (opcional) |
int |
El número máximo esperado de filas coincidentes que se van a contar. El valor predeterminado es |
|
filter (opcional) |
SearchFilter |
Un filtro que se aplica a los resultados de |
|
aggregationList (opcional) |
|
La configuración de agregación. Para más detalles sobre la configuración, consulte Aggregation. |
|
groupByList (opcional) |
|
La configuración de agrupación. Para más detalles sobre la configuración, consulte Aggregation. |
|
token (opcional) |
byte[] |
El token de paginación. Establezca este parámetro con el valor |
Condición de consulta anidada
request.searchQuery.query es un objeto NestedQuery que contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
path (obligatorio) |
String |
La ruta del campo anidado que se va a consultar. Para un campo anidado de varios niveles, establezca este parámetro con la ruta completa del campo anidado objetivo, por ejemplo, |
|
query (obligatorio) |
Query |
La condición de consulta que se ejecutará en las filas secundarias bajo |
|
scoreMode (obligatorio) |
ScoreMode |
El modo de puntuación de la fila principal cuando coinciden varias filas secundarias. |
|
innerHits (opcional) |
InnerHits |
La configuración para devolver, ordenar, paginar y resaltar las filas secundarias coincidentes. Si omite este parámetro, no se devuelven los detalles de las filas secundarias coincidentes. |
|
weight (opcional) |
float |
El peso de la consulta. El valor predeterminado es |
Configuración de devolución de filas secundarias
request.searchQuery.query.innerHits es un objeto InnerHits que contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
sort (opcional) |
Sort |
El orden de clasificación de las filas secundarias coincidentes. Puede usar |
|
offset (opcional) |
Integer |
La posición inicial desde la cual se devuelven las filas secundarias coincidentes. |
|
limit (opcional) |
Integer |
El número máximo de filas secundarias coincidentes que se van a devolver. El valor predeterminado es |
|
highlight (opcional) |
Highlight |
La configuración de resaltado para las filas secundarias coincidentes. Para obtener información sobre los campos y parámetros compatibles con el resaltado, consulte Summary and highlighting. |
Columnas devueltas
request.columnsToGet es un objeto SearchRequest.ColumnsToGet que contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
columns (opcional) |
|
Las columnas de atributos que se van a devolver. Configure este parámetro solo si tanto |
|
returnAll (opcional) |
boolean |
Especifica si se deben devolver todas las columnas de atributos de la tabla de datos. El valor predeterminado es |
|
returnAllFromIndex (opcional) |
boolean |
Especifica si se deben devolver todas las columnas de atributos indexadas. El valor predeterminado es |
Valores de retorno
Respuesta de búsqueda
search devuelve un objeto SearchResponse. La siguiente tabla describe los campos principales.
|
Nombre |
Tipo |
Descripción |
|
totalCount |
long |
El número de filas coincidentes. Llame a |
|
rows |
|
Las filas devueltas por esta consulta. Llame a |
|
searchHits |
|
Las coincidencias de la consulta. Llame a |
|
nextToken |
byte[] |
El token de la página siguiente. Llame a |
|
isAllSuccess |
boolean |
Indica si todas las particiones del índice se consultaron correctamente. Llame a |
Coincidencia de búsqueda
response.searchHits[] es un objeto SearchHit que contiene los siguientes campos principales.
|
Nombre |
Tipo |
Descripción |
|
row |
Row |
La fila o fila secundaria coincidente. Llame a |
|
score |
Double |
La puntuación de relevancia. Llame a |
|
offset |
Integer |
La posición de una fila secundaria anidada en la matriz original. Llame a |
|
highlightResultItem |
HighlightResultItem |
El resultado del resaltado. Llame a |
|
searchInnerHits |
|
Las filas secundarias coincidentes agrupadas por la ruta del campo anidado. Llame a |
Coincidencia anidada
response.searchHits[].searchInnerHits contiene valores SearchInnerHit con los siguientes campos.
|
Nombre |
Tipo |
Descripción |
|
path |
String |
La ruta del campo anidado. Llame a |
|
subSearchHits |
|
Las filas secundarias coincidentes. Llame a |
Ejemplos de escenarios
Consultar un campo anidado de varios niveles
Para consultar un campo anidado de varios niveles, establezca path con la ruta completa del campo anidado objetivo y especifique la ruta completa del subcampo en la subconsulta. El siguiente ejemplo consulta filas en las que items.details.name es igual a beta.
TermQuery termQuery = new TermQuery();
termQuery.setFieldName("items.details.name");
termQuery.setTerm(ColumnValue.fromString("beta"));
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("items.details");
nestedQuery.setQuery(termQuery);
nestedQuery.setScoreMode(ScoreMode.None);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);
Exigir que la misma fila secundaria cumpla varias condiciones
Configure un BoolQuery que contenga varias condiciones secundarias como subconsulta de un único NestedQuery. El siguiente ejemplo exige que la misma fila secundaria en items tenga un valor items.keyword igual a tablestore y un campo items.number.
TermQuery termQuery = new TermQuery();
termQuery.setFieldName("items.keyword");
termQuery.setTerm(ColumnValue.fromString("tablestore"));
ExistsQuery existsQuery = new ExistsQuery();
existsQuery.setFieldName("items.number");
BoolQuery childQuery = new BoolQuery();
childQuery.setMustQueries(Arrays.asList(termQuery, existsQuery));
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("items");
nestedQuery.setQuery(childQuery);
nestedQuery.setScoreMode(ScoreMode.None);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);
Permitir que distintas filas secundarias cumplan varias condiciones
Cree un NestedQuery para cada condición y combine las consultas anidadas en un BoolQuery externo. El siguiente ejemplo permite que el valor items.keyword igual a tablestore y la existencia de items.number sean coincidentes en distintas filas secundarias.
TermQuery termQuery = new TermQuery();
termQuery.setFieldName("items.keyword");
termQuery.setTerm(ColumnValue.fromString("tablestore"));
NestedQuery termNestedQuery = new NestedQuery();
termNestedQuery.setPath("items");
termNestedQuery.setQuery(termQuery);
termNestedQuery.setScoreMode(ScoreMode.None);
ExistsQuery existsQuery = new ExistsQuery();
existsQuery.setFieldName("items.number");
NestedQuery existsNestedQuery = new NestedQuery();
existsNestedQuery.setPath("items");
existsNestedQuery.setQuery(existsQuery);
existsNestedQuery.setScoreMode(ScoreMode.None);
BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustQueries(
Arrays.asList(termNestedQuery, existsNestedQuery));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
Devolver y resaltar filas secundarias coincidentes
Use InnerHits para configurar la cantidad, el orden de clasificación y la configuración de resaltado de las filas secundarias coincidentes. El siguiente ejemplo consulta filas secundarias cuyo campo items.description contiene hangzhou y devuelve resultados resaltados.
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);
En una consulta anidada de varios niveles, configure innerHits en cada nivel de NestedQuery desde el cual se deban devolver o resaltar filas secundarias coincidentes.