Une requête Exists avec le SDK Tablestore pour Java filtre les données selon qu'un champ spécifié existe ou non.
Prérequis
Installez le SDK Tablestore pour Java et initialisez un client.
Description de la fonctionnalité
Une requête Exists (ExistsQuery, également appelée requête NULL ou requête sur valeur nulle) renvoie les lignes contenant un champ indexé spécifié. Un champ est considéré comme inexistant si la colonne correspondante n'a pas été écrite dans la table de données. Un tableau vide est également traité comme un champ de tableau inexistant.
Lors de l'appel à search, définissez le type de requête sur ExistsQuery et indiquez le nom du champ. Pour interroger un champ parent Nested ou un sous-champ, encapsulez ExistsQuery dans une NestedQuery. Pour cibler les lignes où un champ est absent, ajoutez ExistsQuery à BoolQuery.mustNotQueries.
SearchResponse search(SearchRequest request)
L'exemple suivant interroge les lignes où le champ city existe. La requête renvoie jusqu'à 10 lignes ainsi que le nombre total de correspondances.
String tableName = "example_table";
String indexName = "example_index";
ExistsQuery existsQuery = new ExistsQuery();
existsQuery.setFieldName("city");
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(existsQuery);
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.getTotalCount());
System.out.println(response.getRows());
Paramètres
Requête 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 requête et paramètres généraux. |
|
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 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 requête. 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 |
|
collapse (facultatif) |
Collapse |
Paramètres de regroupement des résultats, permettant 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
request.searchQuery.query est un objet ExistsQuery qui contient le paramètre suivant.
|
Nom |
Type |
Description |
|
fieldName (obligatoire) |
String |
Nom du champ indexé à interroger. |
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
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 |
Exemples de scénarios
Interroger les lignes dans lesquelles un champ n'existe pas
Ajoutez ExistsQuery à BoolQuery.mustNotQueries pour cibler les lignes où le champ city n'existe pas.
ExistsQuery existsQuery = new ExistsQuery();
existsQuery.setFieldName("city");
BoolQuery boolQuery = new BoolQuery();
boolQuery.setMustNotQueries(Collections.singletonList(existsQuery));
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(boolQuery);
Interroger un champ Nested
Encapsulez ExistsQuery dans une NestedQuery. Pour interroger le champ parent, définissez fieldName sur items. Pour interroger un sous-champ, spécifiez le chemin complet, par exemple items.keyword. L'exemple suivant interroge les lignes où le sous-champ items.keyword existe.
ExistsQuery existsQuery = new ExistsQuery();
existsQuery.setFieldName("items.keyword");
NestedQuery nestedQuery = new NestedQuery();
nestedQuery.setPath("items");
nestedQuery.setQuery(existsQuery);
nestedQuery.setScoreMode(ScoreMode.None);
SearchQuery searchQuery = new SearchQuery();
searchQuery.setQuery(nestedQuery);