O filtro pós-consulta (Filter) aplica uma etapa adicional de filtragem aos resultados de consultas em índices de busca. Esse recurso permite substituir o otimizador interno de consultas e forçar a execução de condições específicas na fase final. Se usado corretamente, melhora significativamente o desempenho das consultas.
O recurso de filtro pós-consulta está disponível a partir da versão 5.17.5 do Java SDK. Para usá-lo, entre em contato com o suporte técnico do Tablestore para ativá-lo.
Arquitetura do recurso
O filtro pós-consulta baseia-se em uma arquitetura de consulta multicamada:
SearchRequest: Contêiner de nível superior para uma solicitação de consulta. Inclui o nome da tabela, o nome do índice e as configurações específicas da consulta.
SearchQuery: Configuração principal da consulta. Contém a condição de consulta primária (Query) e um filtro de consulta opcional (SearchFilter).
Query: Condição principal da consulta. Aceita todos os tipos de consulta e tipos de dados do Search Index e recupera os dados iniciais.
SearchFilter: Filtro secundário. Contém condições para filtrar detalhadamente os resultados da consulta principal.
Limitações
Use o filtro pós-consulta obrigatoriamente com uma consulta de índice de busca. Os tipos de consulta compatíveis incluem TermQuery, TermsQuery, RangeQuery, ExistsQuery e BoolQuery.
Em um BoolQuery, apenas as cláusulas
mustQueries,mustNotQuerieseshouldQueriessão compatíveis. A cláusulafilterQueriesnão é compatível.A filtragem funciona somente em campos Keyword, Long e Double com a propriedade
enableSortAndAgghabilitada.Filtros pós-consulta não aceitam definições de peso.
Pré-requisitos
Crie um índice de busca na tabela de dados.
Descrição do método
public SearchResponse search(SearchRequest searchRequest) throws TableStoreException, ClientException
Código de exemplo
O exemplo abaixo demonstra o uso do filtro pós-consulta. A consulta principal localiza dados em que o campo col_keyword é igual a value. Em seguida, o filtro seleciona os registros cujo valor do campo col_long esteja entre 1 e 10.
-
Chamada de API imperativa
private static void queryUsingSetter(SyncClient client) { // [Required] Replace with your table name. String tableName = "<TABLE_NAME>"; // [Required] Replace with your search index name. String indexName = "<SEARCH_INDEX_NAME>"; // Build the main query: an exact match using terms query. TermsQuery termsQuery = new TermsQuery(); termsQuery.setFieldName("col_keyword"); termsQuery.addTerm(ColumnValue.fromString("value")); // Build the filter condition: the value of the col_long field is in the range (1, 10). RangeQuery rangeQuery = new RangeQuery(); rangeQuery.setFieldName("col_long"); rangeQuery.setFrom(ColumnValue.fromLong(1)); rangeQuery.setTo(ColumnValue.fromLong(10)); // Assemble the SearchFilter. SearchFilter searchFilter = new SearchFilter(); searchFilter.setQuery(rangeQuery); // Combine into a complete SearchQuery. SearchQuery searchQuery = new SearchQuery(); searchQuery.setQuery(termsQuery); searchQuery.setFilter(searchFilter); // Construct the request. SearchRequest searchRequest = new SearchRequest(tableName, indexName, searchQuery); // By default, only primary key columns are returned. Set the columns to return as needed. SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet(); // Set to return all columns from the search index. columnsToGet.setReturnAllFromIndex(true); searchRequest.setColumnsToGet(columnsToGet); try { SearchResponse resp = client.search(searchRequest); System.out.println("Rows: " + resp.getRows()); } catch (Exception e) { System.err.println("Search failed: " + e.getMessage()); } }-
Configure a consulta para retornar colunas específicas ou todas as colunas.
SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet(); // Return specific columns. columnsToGet.setColumns(Arrays.asList("col_long", "col_keyword")); // Specify columns. // Or: return all columns. // columnsToGet.setReturnAll(true); searchRequest.setColumnsToGet(columnsToGet); -
Para contar o número total de linhas correspondentes, ative o recurso
totalCounte obtenha a contagem na resposta.// Enable totalCount statistics in searchQuery. searchQuery.setTrackTotalCount(SearchQuery.TRACK_TOTAL_COUNT); // Print the total number of rows from the result. System.out.println("Total Count (matched): " + resp.getTotalCount());
-
-
Chamada de API com padrão Builder
private static void queryUsingBuilder(SyncClient client) { // [Required] Replace with your table name. String tableName = "<TABLE_NAME>"; // [Required] Replace with your search index name. String indexName = "<SEARCH_INDEX_NAME>"; try { // Build SearchQuery: main query and filter condition. SearchQuery searchQuery = SearchQuery.newBuilder() .query(QueryBuilders.terms("col_keyword").terms("value")) // Exact match for the keyword. .filter(SearchFilter.newBuilder() .query(QueryBuilders.range("col_long") .greaterThan(1) // Range (1, 10). .lessThan(10)) .build()) // .trackTotalCount(SearchQuery.TRACK_TOTAL_COUNT) // Enable total match count statistics as needed. .build(); // Construct the request. SearchRequest searchRequest = new SearchRequest(tableName, indexName, searchQuery); // By default, only primary key columns are returned. Set the columns to return as needed. SearchRequest.ColumnsToGet columnsToGet = new SearchRequest.ColumnsToGet(); // Set to return all columns from the search index. columnsToGet.setReturnAllFromIndex(true); searchRequest.setColumnsToGet(columnsToGet); SearchResponse resp = client.search(searchRequest); System.out.println("Rows: " + resp.getRows()); } catch (Exception e) { System.err.println("Search request failed: " + e.getMessage()); } }