Utilisez les filtres post-requête avec le SDK Tablestore pour Java pour affiner les résultats d'une requête principale et isoler les conditions susceptibles d'être exécutées ultérieurement.
Prérequis
Installez le SDK Tablestore pour Java et initialisez le client.
Utilisez le SDK Tablestore pour Java version 5.17.5 ou ultérieure.
Fonctionnement
Un filtre post-requête (SearchFilter) affine les lignes candidates après l'exécution de la requête principale (query). Les agrégations et les regroupements (group-by) sont ensuite calculés à partir des résultats filtrés. Isoler les conditions adaptées à une exécution ultérieure réduit le coût d'évaluation des conditions complexes lors de la requête principale. Le gain de performance réel dépend de la sélectivité de la requête principale et de la condition de filtrage.
Pour utiliser un filtre post-requête, appelez search et configurez séparément la requête principale et SearchFilter dans SearchQuery. La requête principale prend en charge les types de requête fournis par les index de recherche. Le filtre post-requête ne prend en charge que certains types de requête et types de champ. Pour plus d'informations, consultez Limites.
SearchResponse search(SearchRequest request)
L'exemple suivant utilise d'abord TermsQuery pour interroger les lignes dont la valeur du champ category est book. Il applique ensuite un filtre post-requête pour conserver les lignes dont la valeur du champ score_long est supérieure à 1 et inférieure à 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());
Limites
Utilisez un filtre post-requête conjointement avec une requête principale. Configurez la requête principale afin de réduire le nombre de lignes candidates avant l'exécution du filtre post-requête. Ne définissez pas la requête principale sur
MatchAllQuery, sauf si vous devez filtrer toutes les lignes de l'index de recherche.Un filtre post-requête prend uniquement en charge les conditions
TermQuery,TermsQuery,RangeQuery,ExistsQueryetBoolQuerycomposées de ces types de requête.Dans une
BoolQueryutilisée comme filtre post-requête, seulsmustQueries,mustNotQueriesetshouldQueriessont pris en charge.filterQueriesn'est pas pris en charge.Seuls les champs
Keyword,LongetDoublepeuvent être filtrés. Activez l'optionenableSortAndAggpour ces champs.Les conditions de filtre post-requête ne participent pas au calcul de la pertinence. Définir
weightpour une condition de filtre ne modifie pas les scores de pertinence des résultats de la requête.
Paramètres
Requête de recherche
request est un objet SearchRequest qui contient les paramètres suivants.
|
Nom |
Type |
Description |
|
tableName (obligatoire) |
String |
Le nom de la table. |
|
indexName (obligatoire) |
String |
Le nom de l'index de recherche. |
|
searchQuery (obligatoire) |
SearchQuery |
La requête principale, le filtre post-requête et les paramètres de requête communs. |
|
columnsToGet (facultatif) |
SearchRequest.ColumnsToGet |
Les colonnes à renvoyer. Si ce paramètre n'est pas spécifié, seules les colonnes de clé primaire sont renvoyées. |
|
timeoutInMillisecond (facultatif) |
int |
Le délai d'expiration de la requête en millisecondes. La valeur par défaut est |
|
routingValues (facultatif) |
|
Les valeurs de clé primaire d'un champ de routage personnalisé. Vous n'avez pas besoin de configurer ce paramètre si le routage personnalisé n'est pas utilisé. |
Paramètres de requête
request.searchQuery est un objet SearchQuery qui contient les paramètres suivants.
|
Nom |
Type |
Description |
|
query (obligatoire) |
Query |
La condition de requête principale. Les types de requête d'index de recherche sont pris en charge. |
|
filter (obligatoire) |
SearchFilter |
Le filtre post-requête qui affine davantage les lignes candidates après l'exécution de la requête principale. |
|
offset (facultatif) |
Integer |
Le décalage à partir duquel la requête commence. |
|
limit (facultatif) |
Integer |
Le nombre maximal de lignes à renvoyer. Si vous définissez ce paramètre sur |
|
highlight (facultatif) |
Highlight |
Les paramètres de résumé et de mise en surbrillance pour les champs |
|
collapse (facultatif) |
Collapse |
Les paramètres de regroupement utilisés pour dédupliquer les résultats de requête par champ. Pour plus de détails sur la configuration, consultez Regrouper les résultats de requête. |
|
sort (facultatif) |
Sort |
L'ordre de tri des résultats de la requête. Pour plus de détails sur la configuration, consultez Trier et paginer les résultats. |
|
trackTotalCount (facultatif) |
int |
Le nombre maximal de lignes correspondantes à compter. La valeur par défaut est |
|
aggregationList (facultatif) |
|
Les paramètres d'agrégation. Les agrégations sont calculées à partir des résultats du filtre post-requête. Pour plus de détails sur la configuration, consultez Agrégation. |
|
groupByList (facultatif) |
|
Les paramètres de regroupement (group-by). Les regroupements sont calculés à partir des résultats du filtre post-requête. Pour plus de détails sur la configuration, consultez Agrégation. |
|
token (facultatif) |
byte[] |
Le jeton de pagination. Pour lire la page suivante, définissez ce paramètre sur la valeur |
Filtre post-requête
request.searchQuery.filter est un objet SearchFilter qui contient le paramètre suivant.
|
Nom |
Type |
Description |
|
query (obligatoire) |
Query |
La condition de filtre. Les conditions |
Colonnes renvoyées
request.columnsToGet est un objet SearchRequest.ColumnsToGet qui contient les paramètres suivants.
|
Nom |
Type |
Description |
|
columns (facultatif) |
|
Les colonnes d'attribut à renvoyer. Configurez ce paramètre uniquement si |
|
returnAll (facultatif) |
boolean |
Indique s'il faut renvoyer toutes les colonnes d'attribut de la table. Valeur par défaut : |
|
returnAllFromIndex (facultatif) |
boolean |
Indique s'il faut renvoyer toutes les colonnes d'attribut indexées. Valeur par défaut : |
Réponse
search renvoie un objet SearchResponse. Le tableau suivant décrit les champs principaux.
|
Nom |
Type |
Description |
|
totalCount |
long |
Le nombre de lignes correspondant au filtre post-requête, obtenu via |
|
rows |
|
Les lignes renvoyées par la requête actuelle, obtenues via |
|
searchHits |
|
Les occurrences de recherche, obtenues via |
|
aggregationResults |
AggregationResults |
Les résultats d'agrégation calculés à partir des résultats du filtre post-requête, obtenus via |
|
groupByResults |
GroupByResults |
Les résultats de regroupement calculés à partir des résultats du filtre post-requête, obtenus via |
|
nextToken |
byte[] |
Le jeton pour la page suivante, obtenu via |
|
isAllSuccess |
boolean |
Indique si toutes les partitions d'index ont été interrogées, obtenu via |