Uma consulta booleana com o Tablestore SDK for Java combina várias condições de consulta usando a lógica AND, OR e NOT e retorna as linhas que atendem à condição combinada.
Pré-requisitos
Instale o Tablestore SDK for Java e inicialize um cliente.
Descrição do recurso
A consulta booleana usa BoolQuery para combinar uma ou mais subconsultas em uma condição complexa. Uma subconsulta pode ser de qualquer tipo Query, inclusive outro BoolQuery.
O BoolQuery oferece suporte aos seguintes tipos de cláusula:
mustQueries: A linha deve corresponder a todas as subconsultas. As subconsultas correspondentes contribuem para a pontuação de relevância. Esse tipo de cláusula equivale a AND.filterQueries: A linha deve corresponder a todas as subconsultas, mas as correspondências não contribuem para a pontuação de relevância. Essa cláusula também equivale a AND.shouldQueries: A linha deve corresponder pelo menos ao número de subconsultas especificado porminShouldMatch. Corresponder a mais subconsultas resulta em uma pontuação de relevância maior. Esse tipo de cláusula equivale a OR.mustNotQueries: A linha não deve corresponder a nenhuma subconsulta. Esse tipo de cláusula equivale a NOT e não contribui para a pontuação de relevância.
Se minShouldMatch não estiver configurado e a consulta booleana contiver apenas shouldQueries e mustNotQueries, pelo menos uma subconsulta de shouldQueries deverá corresponder. Se a consulta booleana contiver mustQueries ou filterQueries no mesmo nível, as subconsultas de shouldQueries serão opcionais por padrão.
Chame search para executar uma consulta booleana.
SearchResponse search(SearchRequest request)
O exemplo a seguir consulta linhas em que city é igual a hangzhou e category é igual a book. A consulta retorna até 10 linhas e o número total de correspondências.
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
Solicitação de busca
request é um objeto SearchRequest que contém os seguintes parâmetros.
|
Nome |
Tipo |
Descrição |
|
tableName (obrigatório) |
String |
O nome da tabela de dados. |
|
indexName (obrigatório) |
String |
O nome do índice de busca. |
|
searchQuery (obrigatório) |
SearchQuery |
A condição de consulta e as configurações gerais da consulta. |
|
columnsToGet (opcional) |
SearchRequest.ColumnsToGet |
As colunas a retornar. Se esse parâmetro não for configurado, apenas as colunas de chave primária serão retornadas. |
|
timeoutInMillisecond (opcional) |
int |
O tempo limite da consulta no nível da solicitação, em milissegundos. O valor padrão é |
|
routingValues (opcional) |
|
Os valores de chave primária correspondentes aos campos de roteamento personalizados. Deixe esse parâmetro indefinido se o roteamento personalizado não estiver configurado. |
Configurações de consulta
request.searchQuery é um objeto SearchQuery que contém os seguintes parâmetros.
|
Nome |
Tipo |
Descrição |
|
query (obrigatório) |
Query |
A condição de consulta. Defina esse parâmetro como um objeto |
|
offset (opcional) |
Integer |
A posição inicial da consulta. |
|
limit (opcional) |
Integer |
O número máximo de linhas a retornar. Defina esse parâmetro como |
|
highlight (opcional) |
Highlight |
As configurações de resumo e destaque quando uma subconsulta corresponde a um campo Text. Para obter detalhes de configuração, consulte Summary and highlighting. |
|
collapse (opcional) |
Collapse |
As configurações de colapso de campo, que removem duplicatas dos resultados com base em um campo especificado. Para obter detalhes de configuração, consulte Collapse query results. |
|
sort (opcional) |
Sort |
A ordem de classificação dos resultados. Para obter detalhes de configuração, consulte Sort and paginate results. |
|
trackTotalCount (opcional) |
int |
O número máximo esperado de linhas correspondentes a contar. O valor padrão é |
|
filter (opcional) |
SearchFilter |
Um filtro aplicado aos resultados de |
|
aggregationList (opcional) |
|
As configurações de agregação. Para obter detalhes de configuração, consulte Aggregation. |
|
groupByList (opcional) |
|
As configurações de agrupamento. Para obter detalhes de configuração, consulte Aggregation. |
|
token (opcional) |
byte[] |
O token de paginação. Defina esse parâmetro com o valor |
Condição de consulta booleana
request.searchQuery.query é um objeto BoolQuery que contém os seguintes parâmetros.
|
Nome |
Tipo |
Descrição |
|
mustQueries (opcional) |
|
As subconsultas às quais uma linha deve corresponder integralmente. As subconsultas correspondentes contribuem para a pontuação de relevância. Esse tipo de cláusula equivale a AND. |
|
filterQueries (opcional) |
|
As subconsultas às quais uma linha deve corresponder integralmente. As subconsultas correspondentes não contribuem para a pontuação de relevância. Esse tipo de cláusula equivale a AND. |
|
shouldQueries (opcional) |
|
As subconsultas das quais um número mínimo especificado deve corresponder. Esse tipo de cláusula equivale a OR. Corresponder a mais subconsultas gera uma pontuação de relevância maior. |
|
mustNotQueries (opcional) |
|
As subconsultas às quais nenhuma linha pode corresponder. Esse tipo de cláusula equivale a NOT e não contribui para a pontuação de relevância. |
|
minShouldMatch (opcional) |
String ou int |
O número mínimo de subconsultas |
|
weight (opcional) |
Float |
O peso da consulta booleana. Se esse parâmetro for omitido, a consulta usará um peso de |
setMinimumShouldMatch(Integer) está obsoleto. Use setMinShouldMatch(int) ou setMinShouldMatch(String).
Colunas retornadas
request.columnsToGet é um objeto SearchRequest.ColumnsToGet que contém os seguintes parâmetros.
|
Nome |
Tipo |
Descrição |
|
columns (opcional) |
|
As colunas de atributo a retornar. Defina esse parâmetro apenas se |
|
returnAll (opcional) |
boolean |
Especifica se todas as colunas de atributo da tabela de dados devem ser retornadas. O valor padrão é |
|
returnAllFromIndex (opcional) |
boolean |
Especifica se todas as colunas de atributo indexadas devem ser retornadas. O valor padrão é |
Valores de retorno
Resposta da busca
search retorna um objeto SearchResponse. A tabela a seguir descreve os campos principais.
|
Nome |
Tipo |
Descrição |
|
totalCount |
long |
O número de linhas correspondentes. Chame |
|
rows |
|
As linhas retornadas por esta consulta. Chame |
|
searchHits |
|
Os acertos da consulta. Chame |
|
nextToken |
byte[] |
O token da próxima página. Chame |
|
isAllSuccess |
boolean |
Indica se todas as partições do índice foram consultadas com sucesso. Chame |
Acerto da busca
response.searchHits[] é um objeto SearchHit que contém os seguintes campos principais.
|
Nome |
Tipo |
Descrição |
|
row |
Row |
A linha correspondente. Chame |
|
score |
Double |
A pontuação de relevância. Chame |
|
highlightResultItem |
HighlightResultItem |
O resultado de resumo e destaque. Chame |
Exemplos de cenários
Corresponder a qualquer condição
Use shouldQueries para combinar condições e minShouldMatch para especificar o número mínimo de condições que devem corresponder. O exemplo a seguir consulta linhas em que city é igual a hangzhou ou category é 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 linhas que correspondem a uma condição
Use mustNotQueries para excluir linhas que correspondam a qualquer condição especificada. O exemplo a seguir consulta linhas em que city não é 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últiplas condições sem pontuação de relevância
Use filterQueries para exigir que todas as subconsultas correspondam, sem permitir que as condições contribuam para a pontuação de relevância. O exemplo a seguir consulta linhas em que city é igual a hangzhou e category é 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);
Aninhar combinações de condições
Use um BoolQuery como subconsulta de outro BoolQuery para expressar lógica multinível. O exemplo a seguir 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);