Una consulta booleana con el Tablestore SDK for Java combina varias condiciones de consulta mediante lógica AND, OR y NOT, y devuelve las filas que cumplen la condición combinada.
Requisitos previos
Instale Tablestore SDK for Java e inicialice un cliente.
Descripción de la función
Una consulta booleana utiliza BoolQuery para combinar una o más subconsultas en una condición de consulta compleja. Una subconsulta puede ser de cualquier tipo Query, incluido otro BoolQuery.
BoolQuery admite los siguientes tipos de cláusulas:
mustQueries: La fila debe coincidir con todas las subconsultas. Las subconsultas coincidentes contribuyen a la puntuación de relevancia. Este tipo de cláusula equivale a AND.filterQueries: La fila debe coincidir con todas las subconsultas, pero estas no contribuyen a la puntuación de relevancia. Este tipo de cláusula también equivale a AND.shouldQueries: La fila debe coincidir como mínimo con la cantidad de subconsultas especificada porminShouldMatch. Coincidir con más subconsultas genera una mayor puntuación de relevancia. Este tipo de cláusula equivale a OR.mustNotQueries: La fila no debe coincidir con ninguna subconsulta. Este tipo de cláusula equivale a NOT y no contribuye a la puntuación de relevancia.
Si no se configura minShouldMatch y la consulta booleana contiene únicamente shouldQueries y mustNotQueries, debe coincidir al menos una subconsulta de shouldQueries. Si la consulta booleana contiene mustQueries o filterQueries en el mismo nivel, las subconsultas de shouldQueries son opcionales de forma predeterminada.
Llame a search para ejecutar una consulta booleana.
SearchResponse search(SearchRequest request)
El siguiente ejemplo consulta filas donde city es igual a hangzhou y category es igual a book. La consulta devuelve hasta 10 filas y el número total de coincidencias.
String tableName = "example_table";
String indexName = "example_index";
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("city");
cityQuery.setTerm(ColumnValue.fromString("hangzhou"));
TermQuery categoryQuery = new TermQuery();
categoryQuery.setFieldName("category");
categoryQuery.setTerm(ColumnValue.fromString("book"));
BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustQueries(Arrays.asList(cityQuery, categoryQuery));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
searchQuery.setLimit(10);
searchQuery.setTrackTotalCount(SearchQuery.TRACK_TOTAL_COUNT);
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet();
columnsToGet.setReturnAll(true);
request.setColumnsToGet(columnsToGet);
SearchResponse response = client.search(request);
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 devolverán. 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 correspondientes a campos de enrutamiento personalizados. No configure este parámetro 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 en un objeto |
|
offset (opcional) |
Integer |
La posición inicial de la consulta. |
|
limit (opcional) |
Integer |
El número máximo de filas que se devolverán. Establezca este parámetro en |
|
highlight (opcional) |
Highlight |
La configuración de resumen y resaltado cuando una subconsulta coincide con un campo Text. Para obtener detalles sobre la configuración, consulte Summary and highlighting. |
|
collapse (opcional) |
Collapse |
La configuración de colapso de campos, que deduplica los resultados según un campo específico. Para obtener detalles sobre la configuración, consulte Collapse query results. |
|
sort (opcional) |
Sort |
El orden de clasificación de los resultados. Para obtener detalles sobre la configuración, consulte Sort and paginate results. |
|
trackTotalCount (opcional) |
int |
El número máximo esperado de filas coincidentes que se contarán. 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 obtener detalles sobre la configuración, consulte Aggregation. |
|
groupByList (opcional) |
|
La configuración de agrupación. Para obtener 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 booleana
request.searchQuery.query es un objeto BoolQuery que contiene los siguientes parámetros.
|
Nombre |
Tipo |
Descripción |
|
mustQueries (opcional) |
|
Las subconsultas con las que una fila debe coincidir en su totalidad. Las subconsultas coincidentes contribuyen a la puntuación de relevancia. Este tipo de cláusula equivale a AND. |
|
filterQueries (opcional) |
|
Las subconsultas con las que una fila debe coincidir en su totalidad. Las subconsultas coincidentes no contribuyen a la puntuación de relevancia. Este tipo de cláusula equivale a AND. |
|
shouldQueries (opcional) |
|
Las subconsultas de las cuales debe coincidir un número mínimo especificado. Este tipo de cláusula equivale a OR. Coincidir con más subconsultas genera una mayor puntuación de relevancia. |
|
mustNotQueries (opcional) |
|
Las subconsultas con las que ninguna fila puede coincidir. Este tipo de cláusula equivale a NOT y no contribuye a la puntuación de relevancia. |
|
minShouldMatch (opcional) |
String o int |
El número mínimo de subconsultas de |
|
weight (opcional) |
Float |
El peso de la consulta booleana. Si se omite este parámetro, la consulta utiliza un peso de |
setMinimumShouldMatch(Integer) está obsoleto. Utilice setMinShouldMatch(int) o setMinShouldMatch(String).
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 devolverán. Configure este parámetro solo si tanto |
|
returnAll (opcional) |
boolean |
Indica si se deben devolver todas las columnas de atributos de la tabla de datos. El valor predeterminado es |
|
returnAllFromIndex (opcional) |
boolean |
Indica 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 |
|
Los aciertos de la consulta. Llame a |
|
nextToken |
byte[] |
El token de la página siguiente. Llame a |
|
isAllSuccess |
boolean |
Indica si se consultaron correctamente todas las particiones del índice. Llame a |
Acierto de búsqueda
response.searchHits[] es un objeto SearchHit que contiene los siguientes campos principales.
|
Nombre |
Tipo |
Descripción |
|
row |
Row |
La fila coincidente. Llame a |
|
score |
Double |
La puntuación de relevancia. Llame a |
|
highlightResultItem |
HighlightResultItem |
El resultado de resumen y resaltado. Llame a |
Ejemplos de escenarios
Coincidir con cualquier condición
Utilice shouldQueries para combinar condiciones y minShouldMatch para especificar el número mínimo de condiciones que deben coincidir. El siguiente ejemplo consulta filas donde city es igual a hangzhou o category es igual a book.
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("city");
cityQuery.setTerm(ColumnValue.fromString("hangzhou"));
TermQuery categoryQuery = new TermQuery();
categoryQuery.setFieldName("category");
categoryQuery.setTerm(ColumnValue.fromString("book"));
BoolQuery boolQuery = new BoolQuery();
boolQuery.setShouldQueries(Arrays.asList(cityQuery, categoryQuery));
boolQuery.setMinShouldMatch(1);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
Excluir filas que coinciden con una condición
Utilice mustNotQueries para excluir filas que coincidan con cualquier condición especificada. El siguiente ejemplo consulta filas donde city no es igual a hangzhou.
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("city");
cityQuery.setTerm(ColumnValue.fromString("hangzhou"));
BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustNotQueries(Collections.singletonList(cityQuery));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
Filtrar por múltiples condiciones sin puntuación de relevancia
Utilice filterQueries para exigir que todas las subconsultas coincidan sin permitir que las condiciones contribuyan a la puntuación de relevancia. El siguiente ejemplo consulta filas donde city es igual a hangzhou y category es igual a book.
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("city");
cityQuery.setTerm(ColumnValue.fromString("hangzhou"));
TermQuery categoryQuery = new TermQuery();
categoryQuery.setFieldName("category");
categoryQuery.setTerm(ColumnValue.fromString("book"));
BoolQuery boolQuery = new BoolQuery();
boolQuery.setFilterQueries(Arrays.asList(cityQuery, categoryQuery));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
Anidar combinaciones de condiciones
Utilice un BoolQuery como subconsulta de otro BoolQuery para expresar lógica multinivel. El siguiente ejemplo implementa (city = "hangzhou" OR price < 150) OR (category = "book" AND (price = 300 OR price = 400)).
TermQuery cityQuery = new TermQuery();
cityQuery.setFieldName("city");
cityQuery.setTerm(ColumnValue.fromString("hangzhou"));
RangeQuery lowPriceQuery = new RangeQuery();
lowPriceQuery.setFieldName("price");
lowPriceQuery.lessThan(ColumnValue.fromLong(150));
BoolQuery firstGroup = new BoolQuery();
firstGroup.setShouldQueries(Arrays.asList(cityQuery, lowPriceQuery));
TermQuery price300Query = new TermQuery();
price300Query.setFieldName("price");
price300Query.setTerm(ColumnValue.fromLong(300));
TermQuery price400Query = new TermQuery();
price400Query.setFieldName("price");
price400Query.setTerm(ColumnValue.fromLong(400));
BoolQuery priceGroup = new BoolQuery();
priceGroup.setShouldQueries(Arrays.asList(price300Query, price400Query));
TermQuery categoryQuery = new TermQuery();
categoryQuery.setFieldName("category");
categoryQuery.setTerm(ColumnValue.fromString("book"));
BoolQuery secondGroup = new BoolQuery();
secondGroup.setMustQueries(Arrays.asList(categoryQuery, priceGroup));
BoolQuery boolQuery = new BoolQuery();
boolQuery.setShouldQueries(Arrays.asList(firstGroup, secondGroup));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);