Une requête booléenne combine plusieurs sous-requêtes pour récupérer des lignes d'une table de données. Tablestore renvoie uniquement les lignes satisfaisant l'ensemble des conditions combinées. Chaque sous-requête peut être de n'importe quel type, y compris une autre requête booléenne.
Prérequis
Initialisez une instance OTSClient. Pour plus d'informations, consultez la rubrique Initialiser une instance OTSClient.
Créez une table de données et insérez-y des données. Pour plus d'informations, consultez les rubriques Créer une table de données et Écrire des données.
Créez un index de recherche pour la table de données. Pour plus d'informations, consultez la rubrique Créer des index de recherche.
Paramètres
|
Paramètre |
Description |
|
TableName |
Nom de la table de données. |
|
IndexName |
Nom de l'index de recherche. |
|
MustQueries |
Opérateur logique AND. Toutes les sous-requêtes de cette liste doivent correspondre. Seules les lignes satisfaisant toutes les conditions sont renvoyées. |
|
MustNotQueries |
Opérateur logique NOT. Les résultats excluent les lignes correspondant à l'une des sous-requêtes de cette liste. |
|
FilterQueries |
Opérateur logique AND appliqué comme filtre. Seules les lignes satisfaisant tous les sous-filtres sont renvoyées. Contrairement à MustQueries, FilterQueries ne calcule pas de score de pertinence. Il réalise une correspondance binaire (oui/non), ce qui le rend adapté aux correspondances exactes, aux plages et aux conditions numériques. |
|
ShouldQueries |
Opérateur logique OR. Les lignes correspondant au moins au nombre minimal de sous-requêtes sont renvoyées. Plus une ligne correspond à un grand nombre de sous-requêtes, plus son score de pertinence augmente. Si aucune condition MustQueries, MustNotQueries ou FilterQueries n'est définie, au moins une ShouldQuery doit correspondre. Si d'autres conditions sont définies, les ShouldQueries deviennent des boosters de pertinence optionnels avec un minimum par défaut de 0. Définissez MinimumShouldMatch pour remplacer la valeur par défaut. |
|
MinimumShouldMatch |
Nombre minimal de conditions ShouldQueries qu'une ligne doit satisfaire pour être renvoyée. La valeur par défaut est 1 lorsque ShouldQueries est la seule condition, et 0 lorsque des conditions MustQueries, MustNotQueries ou FilterQueries sont également présentes. |
Exemple de code
Les exemples suivants montrent comment construire une requête booléenne. Le premier utilise MustQueries pour exiger que toutes les conditions soient remplies, tandis que le second utilise ShouldQueries pour exiger qu'au moins une condition soit remplie.
/**
* Perform a Boolean query based on a combination of subqueries.
*/
func BoolQuery(client *tablestore.TableStoreClient, tableName string, indexName string) {
searchRequest := &tablestore.SearchRequest{}
searchRequest.SetTableName(tableName)
searchRequest.SetIndexName(indexName)
// Condition 1: range query — Col_Long > 3
rangeQuery := &search.RangeQuery{}
rangeQuery.FieldName = "Col_Long"
rangeQuery.GT(3)
// Condition 2: match query — Col_Keyword contains "hangzhou"
matchQuery := &search.MatchQuery{}
matchQuery.FieldName = "Col_Keyword"
matchQuery.Text = "hangzhou"
{
// MustQueries: both conditions must match (AND)
boolQuery := &search.BoolQuery{
MustQueries: []search.Query{
rangeQuery,
matchQuery,
},
}
searchQuery := search.NewSearchQuery()
searchQuery.SetQuery(boolQuery)
searchRequest.SetSearchQuery(searchQuery)
searchResponse, err := client.Search(searchRequest)
if err != nil {
fmt.Printf("%#v", err)
return
}
fmt.Println("IsAllSuccess: ", searchResponse.IsAllSuccess) // Whether all matching rows were returned
fmt.Println("TotalCount: ", searchResponse.TotalCount) // Total rows matching the query
fmt.Println("RowCount: ", len(searchResponse.Rows))
}
{
// ShouldQueries: at least one condition must match (OR)
boolQuery := &search.BoolQuery{
ShouldQueries: []search.Query{
rangeQuery,
matchQuery,
},
MinimumShouldMatch: proto.Int32(1),
}
searchQuery := search.NewSearchQuery()
searchQuery.SetQuery(boolQuery)
searchRequest.SetSearchQuery(searchQuery)
searchResponse, err := client.Search(searchRequest)
if err != nil {
fmt.Printf("%#v", err)
return
}
fmt.Println("IsAllSuccess: ", searchResponse.IsAllSuccess) // Whether all matching rows were returned
fmt.Println("TotalCount: ", searchResponse.TotalCount) // Total rows matching the query
fmt.Println("RowCount: ", len(searchResponse.Rows))
}
}
FAQ
Références
-
Lorsque vous utilisez un index de recherche pour interroger des données, vous pouvez recourir aux méthodes de requête suivantes : requête term, requête terms, requête match all, requête match, requête match phrase, requête prefix, requête range, requête wildcard, requête geo, requête booléenne, requête vectorielle KNN, requête nested et requête exists. Vous pouvez utiliser les méthodes de requête fournies par l'index de recherche pour interroger des données selon plusieurs dimensions, en fonction de vos besoins métier.
Vous pouvez trier ou paginer les lignes satisfaisant aux conditions de requête en utilisant les fonctionnalités de tri et de pagination. Pour plus d'informations, consultez la rubrique Tri et pagination.
Vous pouvez utiliser la fonctionnalité de collapse (distinction) pour réduire l'ensemble des résultats en fonction d'une colonne spécifique. Ainsi, les données du type spécifié n'apparaissent qu'une seule fois dans les résultats de la requête. Pour plus d'informations, consultez la rubrique Collapse (déduplication).
Si vous souhaitez analyser les données d'une table de données, vous pouvez utiliser la fonctionnalité d'agrégation de l'opération Search ou exécuter des instructions SQL. Par exemple, vous pouvez obtenir les valeurs minimales et maximales, la somme et le nombre total de lignes. Pour plus d'informations, consultez les rubriques Agrégation et Requête SQL.
Si vous souhaitez obtenir toutes les lignes satisfaisant aux conditions de requête sans avoir besoin de les trier, vous pouvez appeler les opérations ParallelScan et ComputeSplits pour utiliser la fonctionnalité de scan parallèle. Pour plus d'informations, consultez la rubrique Effectuer un scan parallèle.