Utilice filtros posteriores a la consulta con Tablestore SDK for Java para filtrar aún más los resultados de una consulta principal y separar de esta las condiciones adecuadas para su ejecución posterior.
Requisitos previos
Instale Tablestore SDK for Java e inicialice el cliente.
Use Tablestore SDK for Java 5.17.5 o posterior.
Funcionamiento
Un filtro posterior a la consulta (SearchFilter) filtra adicionalmente las filas candidatas después de que se ejecuta la consulta principal (query). Posteriormente, las agregaciones y las agrupaciones se calculan a partir de los resultados filtrados. Separar de la consulta principal las condiciones adecuadas para una ejecución posterior reduce el costo de evaluar condiciones complejas durante dicha consulta. La ventaja real de rendimiento depende de la selectividad de la consulta principal y de la condición del filtro.
Para usar un filtro posterior a la consulta, llame a search y configure la consulta principal y SearchFilter por separado en SearchQuery. La consulta principal admite los tipos de consulta proporcionados por los índices de búsqueda. El filtro posterior a la consulta solo admite tipos específicos de consulta y de campo. Para obtener más información, consulte Limits.
SearchResponse search(SearchRequest request)
El siguiente ejemplo utiliza primero TermsQuery para consultar filas donde el valor del campo category es book. A continuación, el ejemplo usa un filtro posterior a la consulta para conservar las filas donde el valor del campo score_long es mayor que 1 y menor que 10.
String tableName = "example_table";
String indexName = "example_index";
// Configure the main query.
TermsQuery termsQuery = new TermsQuery();
termsQuery.setFieldName("category");
termsQuery.addTerm(ColumnValue.fromString("book"));
// Configure the post-query filter.
RangeQuery rangeQuery = new RangeQuery();
rangeQuery.setFieldName("score_long");
rangeQuery.setFrom(ColumnValue.fromLong(1));
rangeQuery.setIncludeLower(false);
rangeQuery.setTo(ColumnValue.fromLong(10));
rangeQuery.setIncludeUpper(false);
SearchFilter searchFilter = new SearchFilter();
searchFilter.setQuery(rangeQuery);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(termsQuery);
searchQuery.setFilter(searchFilter);
searchQuery.setTrackTotalCount(SearchQuery.TRACK_TOTAL_COUNT);
SearchRequest request = new SearchRequest(tableName, indexName, searchQuery);
SearchRequest.ColumnsToGet columnsToGet =
new SearchRequest.ColumnsToGet();
columnsToGet.setReturnAllFromIndex(true);
request.setColumnsToGet(columnsToGet);
SearchResponse response = client.search(request);
System.out.println("Total count: " + response.getTotalCount());
System.out.println("Rows: " + response.getRows());
Límites
Un filtro posterior a la consulta debe usarse junto con una consulta principal. Configure la consulta principal para reducir el número de filas candidatas antes de que se ejecute el filtro posterior. No establezca la consulta principal como
MatchAllQuerya menos que necesite filtrar todas las filas del índice de búsqueda.Un filtro posterior a la consulta solo admite condiciones de tipo
TermQuery,TermsQuery,RangeQuery,ExistsQueryyBoolQuerycompuestas por estos tipos de consulta.En una
BoolQueryutilizada como filtro posterior a la consulta, solo se admitenmustQueries,mustNotQueriesyshouldQueries. No se admitefilterQueries.Solo se pueden filtrar campos de tipo
Keyword,LongyDouble. Debe habilitarenableSortAndAggpara dichos campos.Las condiciones del filtro posterior a la consulta no participan en la puntuación de relevancia. Establecer
weightpara una condición de filtro no modifica las puntuaciones de relevancia de los resultados de la consulta.
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. |
|
indexName (obligatorio) |
String |
El nombre del índice de búsqueda. |
|
searchQuery (obligatorio) |
SearchQuery |
La consulta principal, el filtro posterior a la consulta y la configuración común de la consulta. |
|
columnsToGet (opcional) |
SearchRequest.ColumnsToGet |
Las columnas que se devolverán. Si no se especifica 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 de un campo de enrutamiento personalizado. No es necesario configurar este parámetro si no se utiliza 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 la consulta principal. Se admiten los tipos de consulta de índices de búsqueda. |
|
filter (obligatorio) |
SearchFilter |
El filtro posterior a la consulta que filtra adicionalmente las filas candidatas después de que se ejecuta la consulta principal. |
|
offset (opcional) |
Integer |
El desplazamiento desde el cual comienza la consulta. |
|
limit (opcional) |
Integer |
El número máximo de filas que se devolverán. Si establece este parámetro en |
|
highlight (opcional) |
Highlight |
La configuración de resumen y resaltado para campos de tipo |
|
collapse (opcional) |
Collapse |
La configuración de colapso de campos utilizada para deduplicar los resultados de la consulta por 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 de la consulta. Para obtener detalles sobre la configuración, consulte Sort and paginate results. |
|
trackTotalCount (opcional) |
int |
El número máximo de filas coincidentes que se contarán. El valor predeterminado es |
|
aggregationList (opcional) |
|
La configuración de agregaciones. Las agregaciones se calculan a partir de los resultados del filtro posterior a la consulta. Para obtener detalles sobre la configuración, consulte Aggregation. |
|
groupByList (opcional) |
|
La configuración de agrupaciones. Las agrupaciones se calculan a partir de los resultados del filtro posterior a la consulta. Para obtener detalles sobre la configuración, consulte Aggregation. |
|
token (opcional) |
byte[] |
El token de paginación. Para leer la página siguiente, establezca este parámetro con el valor |
Filtro posterior a la consulta
request.searchQuery.filter es un objeto SearchFilter que contiene el siguiente parámetro.
|
Nombre |
Tipo |
Descripción |
|
query (obligatorio) |
Query |
La condición del filtro. Se admiten condiciones de tipo |
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 |
Especifica si se deben devolver todas las columnas de atributos de la tabla. Valor predeterminado: |
|
returnAllFromIndex (opcional) |
boolean |
Especifica si se deben devolver todas las columnas de atributos indexadas. Valor predeterminado: |
Respuesta
search devuelve un objeto SearchResponse. La siguiente tabla describe los campos principales.
|
Nombre |
Tipo |
Descripción |
|
totalCount |
long |
El número de filas que coinciden con el filtro posterior a la consulta, obtenido mediante |
|
rows |
|
Las filas devueltas por la solicitud actual, obtenidas mediante |
|
searchHits |
|
Los aciertos de búsqueda, obtenidos mediante |
|
aggregationResults |
AggregationResults |
Los resultados de agregación calculados a partir de los resultados del filtro posterior a la consulta, obtenidos mediante |
|
groupByResults |
GroupByResults |
Los resultados de agrupación calculados a partir de los resultados del filtro posterior a la consulta, obtenidos mediante |
|
nextToken |
byte[] |
El token para la página siguiente, obtenido mediante |
|
isAllSuccess |
boolean |
Indica si se consultaron todas las particiones del índice, obtenido mediante |