Todos os produtos
Search
Central de documentação

Tablestore:Filtro pós-consulta

Última atualização: Jun 30, 2026

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.

Nota

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, mustNotQueries e shouldQueries são compatíveis. A cláusula filterQueries não é compatível.

  • A filtragem funciona somente em campos Keyword, Long e Double com a propriedade enableSortAndAgg habilitada.

  • Filtros pós-consulta não aceitam definições de peso.

Pré-requisitos

Descrição do método

public SearchResponse search(SearchRequest searchRequest) throws TableStoreException, ClientException

Parâmetros do filtro de consulta no SearchQuery de um SearchRequest

  • query (obrigatório) Query: Configuração da condição de consulta principal. Este parâmetro aceita todos os tipos de consulta do Search Index e contém os seguintes parâmetros:

    Nome

    Tipo de dado

    Descrição

    type (obrigatório)

    QueryType

    Tipo da consulta. Todos os tipos de consulta da API Search são compatíveis. Não use MatchAllQuery.

    query (obrigatório)

    bytes

    Condição da consulta.

  • filter (opcional) SearchFilter: Configuração do filtro secundário. Aplica uma filtragem refinada aos resultados da consulta principal e contém os seguintes parâmetros:

    • query (obrigatório) Query: Configuração da condição de filtragem. Aceita apenas tipos específicos de consulta e contém os seguintes parâmetros:

      Nome

      Tipo de dado

      Descrição

      type (obrigatório)

      QueryType

      Tipo da consulta. São compatíveis apenas TermQuery, TermsQuery, RangeQuery, ExistsQuery e BoolQuery composto por esses tipos.

      query (obrigatório)

      bytes

      Condição da consulta.

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 totalCount e 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());
        }
    }