Une requête booléenne avec le SDK Tablestore pour Java combine plusieurs conditions de recherche à l'aide des opérateurs logiques ET, OU et NON, et renvoie les lignes satisfaisant la condition combinée.
Prérequis
Installez le SDK Tablestore pour Java et initialisez un client.
Description de la fonctionnalité
Une requête booléenne utilise BoolQuery pour combiner une ou plusieurs sous-requêtes en une condition de recherche complexe. Une sous-requête peut être de n'importe quel type Query, y compris une autre BoolQuery.
BoolQuery prend en charge les types de clauses suivants :
mustQueries: la ligne doit correspondre à toutes les sous-requêtes. Les sous-requêtes correspondantes contribuent au score de pertinence. Ce type de clause équivaut à l'opérateur ET.filterQueries: la ligne doit correspondre à toutes les sous-requêtes, mais celles-ci ne contribuent pas au score de pertinence. Ce type de clause équivaut également à l'opérateur ET.shouldQueries: la ligne doit correspondre au moins au nombre de sous-requêtes spécifié parminShouldMatch. Plus le nombre de sous-requêtes correspondantes est élevé, plus le score de pertinence augmente. Ce type de clause équivaut à l'opérateur OU.mustNotQueries: la ligne ne doit correspondre à aucune sous-requête. Ce type de clause équivaut à l'opérateur NON et ne contribue pas au score de pertinence.
Si minShouldMatch n'est pas configuré et que la requête booléenne contient uniquement des shouldQueries et des mustNotQueries, au moins une sous-requête shouldQueries doit correspondre. Si la requête booléenne contient simultanément des mustQueries ou des filterQueries au même niveau, les sous-requêtes shouldQueries sont facultatives par défaut.
Appelez search pour exécuter une requête booléenne.
SearchResponse search(SearchRequest request)
L'exemple suivant interroge les lignes dont la valeur de city est égale à hangzhou et dont la valeur de category est égale à book. La requête renvoie jusqu'à 10 lignes ainsi que le nombre total de correspondances.
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());
Paramètres
Demande de recherche
request est un objet SearchRequest qui contient les paramètres suivants.
|
Nom |
Type |
Description |
|
tableName (obligatoire) |
String |
Nom de la table de données. |
|
indexName (obligatoire) |
String |
Nom de l'index de recherche. |
|
searchQuery (obligatoire) |
SearchQuery |
Condition de recherche et paramètres généraux de la requête. |
|
columnsToGet (facultatif) |
SearchRequest.ColumnsToGet |
Colonnes à renvoyer. Si ce paramètre n'est pas configuré, seules les colonnes de clé primaire sont renvoyées. |
|
timeoutInMillisecond (facultatif) |
int |
Délai d'expiration de la requête au niveau de la demande, en millisecondes. La valeur par défaut est |
|
routingValues (facultatif) |
|
Valeurs de clé primaire correspondant aux champs de routage personnalisés. Laissez ce paramètre non défini si le routage personnalisé n'est pas configuré. |
Paramètres de la requête
request.searchQuery est un objet SearchQuery qui contient les paramètres suivants.
|
Nom |
Type |
Description |
|
query (obligatoire) |
Query |
Condition de recherche. Définissez ce paramètre sur un objet |
|
offset (facultatif) |
Integer |
Position de départ de la requête. |
|
limit (facultatif) |
Integer |
Nombre maximal de lignes à renvoyer. Définissez ce paramètre sur |
|
highlight (facultatif) |
Highlight |
Paramètres de résumé et de mise en surbrillance lorsqu'une sous-requête correspond à un champ Text. Pour plus de détails sur la configuration, consultez Résumé et mise en surbrillance. |
|
collapse (facultatif) |
Collapse |
Paramètres de regroupement des résultats, qui permettent de dédupliquer les résultats selon un champ spécifié. Pour plus de détails sur la configuration, consultez Regrouper les résultats de la requête. |
|
sort (facultatif) |
Sort |
Ordre de tri des résultats. Pour plus de détails sur la configuration, consultez Trier et paginer les résultats. |
|
trackTotalCount (facultatif) |
int |
Nombre maximal attendu de lignes correspondantes à compter. La valeur par défaut est |
|
filter (facultatif) |
SearchFilter |
Filtre appliqué aux résultats de |
|
aggregationList (facultatif) |
|
Paramètres d'agrégation. Pour plus de détails sur la configuration, consultez Agrégation. |
|
groupByList (facultatif) |
|
Paramètres de regroupement. Pour plus de détails sur la configuration, consultez Agrégation. |
|
token (facultatif) |
byte[] |
Jeton de pagination. Définissez ce paramètre sur la valeur |
Condition de requête booléenne
request.searchQuery.query est un objet BoolQuery qui contient les paramètres suivants.
|
Nom |
Type |
Description |
|
mustQueries (facultatif) |
|
Sous-requêtes auxquelles la ligne doit obligatoirement correspondre. Les sous-requêtes correspondantes contribuent au score de pertinence. Ce type de clause équivaut à l'opérateur ET. |
|
filterQueries (facultatif) |
|
Sous-requêtes auxquelles la ligne doit obligatoirement correspondre. Les sous-requêtes correspondantes ne contribuent pas au score de pertinence. Ce type de clause équivaut à l'opérateur ET. |
|
shouldQueries (facultatif) |
|
Sous-requêtes dont un nombre minimum spécifié doit correspondre. Ce type de clause équivaut à l'opérateur OU. Plus le nombre de sous-requêtes correspondantes est élevé, plus le score de pertinence augmente. |
|
mustNotQueries (facultatif) |
|
Sous-requêtes auxquelles aucune ligne ne doit correspondre. Ce type de clause équivaut à l'opérateur NON et ne contribue pas au score de pertinence. |
|
minShouldMatch (facultatif) |
String ou int |
Nombre minimum de sous-requêtes |
|
weight (facultatif) |
Float |
Poids de la requête booléenne. Si ce paramètre est omis, la requête utilise un poids de |
setMinimumShouldMatch(Integer) est obsolète. Utilisez setMinShouldMatch(int) ou setMinShouldMatch(String).
Colonnes renvoyées
request.columnsToGet est un objet SearchRequest.ColumnsToGet qui contient les paramètres suivants.
|
Nom |
Type |
Description |
|
columns (facultatif) |
|
Colonnes d'attribut à renvoyer. Définissez ce paramètre uniquement si |
|
returnAll (facultatif) |
boolean |
Indique s'il faut renvoyer toutes les colonnes d'attribut de la table de données. La valeur par défaut est |
|
returnAllFromIndex (facultatif) |
boolean |
Indique s'il faut renvoyer toutes les colonnes d'attribut indexées. La valeur par défaut est |
Valeurs de retour
Réponse de recherche
search renvoie un objet SearchResponse. Le tableau suivant décrit les champs principaux.
|
Nom |
Type |
Description |
|
totalCount |
long |
Nombre de lignes correspondantes. Appelez |
|
rows |
|
Lignes renvoyées par cette requête. Appelez |
|
searchHits |
|
Résultats de la requête. Appelez |
|
nextToken |
byte[] |
Jeton de la page suivante. Appelez |
|
isAllSuccess |
boolean |
Indique si toutes les partitions d'index ont été interrogées avec succès. Appelez |
Résultat de recherche
response.searchHits[] est un objet SearchHit qui contient les champs principaux suivants.
|
Nom |
Type |
Description |
|
row |
Row |
Ligne correspondante. Appelez |
|
score |
Double |
Score de pertinence. Appelez |
|
highlightResultItem |
HighlightResultItem |
Résultat de résumé et de mise en surbrillance. Appelez |
Exemples de scénarios
Correspondance à n'importe quelle condition
Utilisez shouldQueries pour combiner des conditions et minShouldMatch pour spécifier le nombre minimum de conditions devant correspondre. L'exemple suivant interroge les lignes dont la valeur de city est égale à hangzhou ou dont la valeur de category est égale à 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);
Exclure les lignes correspondant à une condition
Utilisez mustNotQueries pour exclure les lignes correspondant à n'importe quelle condition spécifiée. L'exemple suivant interroge les lignes dont la valeur de city n'est pas égale à 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);
Filtrer par plusieurs conditions sans calcul de score de pertinence
Utilisez filterQueries pour exiger que toutes les sous-requêtes correspondent sans permettre aux conditions de contribuer au score de pertinence. L'exemple suivant interroge les lignes dont la valeur de city est égale à hangzhou et dont la valeur de category est égale à 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);
Imbriquer des combinaisons de conditions
Utilisez une BoolQuery comme sous-requête d'une autre BoolQuery pour exprimer une logique multiniveau. L'exemple suivant implémente (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);