Utilisez une requête avec caractères génériques dans le SDK Tablestore pour Go afin de faire correspondre des valeurs ou des jetons à l'aide d'astérisques (*) et de points d'interrogation (?).
Prérequis
Installez le SDK Tablestore pour Go et initialisez un client.
Description
Une requête avec caractères génériques utilise un astérisque (*) pour correspondre à zéro ou plusieurs caractères, et un point d'interrogation (?) pour correspondre à un seul caractère. Pour un champ de type Text, la requête s'applique aux termes tokenisés. La correspondance est sensible à la casse et la chaîne de requête peut contenir jusqu'à 32 caractères.
func (client *tablestore.TableStoreClient) Search(request *tablestore.SearchRequest) (*tablestore.SearchResponse, error)
L'exemple suivant interroge les données et renvoie jusqu'à 10 lignes ainsi que le nombre total de lignes correspondantes.
tableName := "example_table"
indexName := "example_index"
query := &search.WildcardQuery{FieldName: "category", Value: "book-*"}
searchQuery := search.NewSearchQuery().
SetQuery(query).
SetLimit(10).
SetGetTotalCount(true)
response, err := client.Search(&tablestore.SearchRequest{
TableName: tableName,
IndexName: indexName,
SearchQuery: searchQuery,
ColumnsToGet: &tablestore.ColumnsToGet{
ReturnAllFromIndex: true,
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response.TotalCount)
fmt.Println(response.Rows)
Paramètres
Requête de recherche
Le paramètre request est de type tablestore.SearchRequest et 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) |
search.SearchQuery |
Condition de requête et configurations courantes. |
|
ColumnsToGet (facultatif) |
*tablestore.ColumnsToGet |
Configuration des colonnes à renvoyer. Si ce paramètre est omis, seules les colonnes de clé primaire sont renvoyées. |
|
RoutingValues (facultatif) |
[]*tablestore.PrimaryKey |
Valeurs de clé primaire pour les champs de routage personnalisés. Omettez ce paramètre si le routage personnalisé n'est pas configuré. |
|
TimeoutMs (facultatif) |
*int32 |
Délai d'expiration de la requête en millisecondes. |
Configuration de la requête
Créez une configuration de requête en appelant search.NewSearchQuery() et configurez-la à l'aide des méthodes suivantes.
|
Nom |
Type |
Description |
|
SetQuery (obligatoire) |
search.Query |
Spécifie la condition de requête. |
|
SetOffset (facultatif) |
int32 |
Spécifie la position de départ. Valeur par défaut : 0. Pour la pagination basée sur le décalage, Offset + Limit ne peut pas dépasser 100 000. |
|
SetLimit (facultatif) |
int32 |
Spécifie le nombre maximal de lignes à renvoyer. Valeur par défaut : 10. Valeur maximale : 100. Une valeur de 0 ne renvoie aucune ligne. |
|
SetHighlight (facultatif) |
*search.Highlight |
Configure les résumés et la mise en surbrillance pour les champs Text. Pour plus d'informations, consultez Résumé et mise en surbrillance. |
|
SetCollapse (facultatif) |
*search.Collapse |
Regroupe les résultats de la requête. Pour plus d'informations, consultez Regrouper les résultats de requête. |
|
SetSort (facultatif) |
*search.Sort |
Spécifie l'ordre de tri des résultats. Pour plus d'informations, consultez Trier et paginer les résultats. |
|
SetGetTotalCount (facultatif) |
bool |
Indique s'il faut compter toutes les lignes correspondantes. Valeur par défaut : false. |
|
SetToken (facultatif) |
[]byte |
Spécifie la valeur NextToken renvoyée par la réponse précédente. Cette méthode efface Sort car le jeton contient les conditions de tri de la page précédente. Ne spécifiez pas Offset lors de l'utilisation de la pagination basée sur un jeton. |
|
SetSearchFilter (facultatif) |
*search.SearchFilter |
Applique un filtre post-requête. Pour plus d'informations, consultez Utiliser des filtres post-requête. |
|
Aggregation (facultatif) |
...search.Aggregation |
Configure les agrégations. Pour plus d'informations, consultez Agrégation. |
|
GroupBy (facultatif) |
...search.GroupBy |
Configure le regroupement. Pour plus d'informations, consultez Agrégation. |
Condition de requête
La requête est de type search.WildcardQuery et contient les paramètres suivants.
|
Nom |
Type |
Description |
|
FieldName (obligatoire) |
string |
Nom du champ d'index à interroger. |
|
Value (obligatoire) |
string |
Chaîne de requête avec caractères génériques, pouvant contenir jusqu'à 32 caractères. |
Colonnes à renvoyer
Le paramètre request.ColumnsToGet est de type tablestore.ColumnsToGet et contient les paramètres suivants.
|
Nom |
Type |
Description |
|
Columns (facultatif) |
[]string |
Colonnes d'attribut à renvoyer. Ce paramètre prend effet uniquement lorsque ReturnAll et ReturnAllFromIndex sont tous deux définis sur false. |
|
ReturnAll (facultatif) |
bool |
Indique s'il faut renvoyer toutes les colonnes d'attribut de la table de données. Valeur par défaut : false. |
|
ReturnAllFromIndex (facultatif) |
bool |
Indique s'il faut renvoyer toutes les colonnes d'attribut indexées. Valeur par défaut : false. Ne définissez pas ce paramètre et ReturnAll sur true simultanément. |
Réponse
La méthode Search renvoie une valeur tablestore.SearchResponse. Le tableau suivant décrit les champs métier principaux.
|
Nom |
Type |
Description |
|
TotalCount |
int64 |
Nombre total de lignes correspondantes. La valeur dépend de SetGetTotalCount. |
|
Rows |
[]*tablestore.Row |
Lignes renvoyées par la requête actuelle. Le nombre ne dépasse pas la valeur spécifiée par SetLimit. |
|
SearchHits |
[]*tablestore.SearchHit |
Résultats de recherche. Lisez ce champ lorsque vous utilisez la mise en surbrillance, les hits internes imbriqués ou les scores de pertinence. |
|
NextToken |
[]byte |
Jeton pour la page suivante. Si la valeur n'est pas vide, transmettez-la à la requête suivante. |
|
IsAllSuccess |
bool |
Indique si toutes les partitions d'index ont été interrogées. Si la valeur est false, des résultats partiels sont renvoyés et TotalCount peut être inférieur au nombre réel de lignes correspondantes. |
|
AggregationResults |
search.AggregationResults |
Résultats d'agrégation. |
|
GroupByResults |
search.GroupByResults |
Résultats de regroupement. |
Exemples
Améliorer les performances des requêtes de sous-chaînes
Pour un modèle de requête tel que *word*, configurez le champ Text avec l'analyseur flou lors de la création de l'index de recherche, et utilisez une requête de correspondance de phrase pour interroger le champ. Cette approche offre généralement de meilleures performances qu'une requête avec caractères génériques pour la correspondance de sous-chaînes. Pour les règles de correspondance et les limites, consultez Requêtes avec caractères génériques basées sur les jetons.
L'exemple suivant crée un index de recherche contenant le champ file_name et configure l'analyseur flou pour ce champ.
analyzer := tablestore.Analyzer_Fuzzy
fieldSchema := &tablestore.FieldSchema{
FieldName: proto.String("file_name"),
FieldType: tablestore.FieldType_TEXT,
Index: proto.Bool(true),
Analyzer: &analyzer,
AnalyzerParameter: tablestore.FuzzyAnalyzerParameter{},
}
request := &tablestore.CreateSearchIndexRequest{
TableName: "example_table",
IndexName: "example_index",
IndexSchema: &tablestore.IndexSchema{
FieldSchemas: []*tablestore.FieldSchema{fieldSchema},
},
}
_, err := client.CreateSearchIndex(request)
if err != nil {
log.Fatal(err)
}
Une fois les données d'index synchronisées, utilisez une MatchPhraseQuery pour interroger les lignes dont le champ file_name contient word à n'importe quelle position.
query := &search.MatchPhraseQuery{
FieldName: "file_name",
Text: "word",
}
searchQuery := search.NewSearchQuery().
SetQuery(query).
SetLimit(10)
response, err := client.Search(&tablestore.SearchRequest{
TableName: "example_table",
IndexName: "example_index",
SearchQuery: searchQuery,
ColumnsToGet: &tablestore.ColumnsToGet{
ReturnAllFromIndex: true,
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response.Rows)
Exclure les lignes correspondant à un modèle avec caractères génériques
Pour implémenter l'équivalent de SQL NOT LIKE, ajoutez une WildcardQuery à BoolQuery.MustNotQueries.
wildcardQuery := &search.WildcardQuery{
FieldName: "category",
Value: "book-*",
}
query := &search.BoolQuery{
MustNotQueries: []search.Query{wildcardQuery},
}
searchQuery := search.NewSearchQuery().
SetQuery(query).
SetLimit(10)
response, err := client.Search(&tablestore.SearchRequest{
TableName: "example_table",
IndexName: "example_index",
SearchQuery: searchQuery,
ColumnsToGet: &tablestore.ColumnsToGet{
ReturnAllFromIndex: true,
},
})
if err != nil {
log.Fatal(err)
}
fmt.Println(response.Rows)