Les requêtes vectorielles fonctionnent en recherchant dans une base de données vectorielle les vecteurs les plus proches de votre vecteur de requête dans l'ensemble du cluster. Cette page explique comment cela fonctionne.
Rechercher des vecteurs similaires
Les requêtes de recherche vectorielle utilisent deux stratégies:
- K-Nearest Neighbors (KNN): recherche les k vecteurs les plus proches de votre vecteur de requête.
- Voisin le plus proche (ANN): recherche les k vecteurs les plus proches de votre vecteur de requête.
Pour utiliser KNN, vous devez créer des index avec le type d'index vectoriel FLAT. Avec KNN, les requêtes de recherche sont exactes, mais plus lentes. Pour utiliser une ANN, vous devez créer des index avec le type d'index vectoriel HNSW. Avec les ANN, les requêtes de recherche seront approximatives, mais plus rapides. Vous pouvez améliorer la précision de l'ANN en ajustant les paramètres de l'index HNSW et le paramètre EF_RUNTIME dans la requête.
Répartition de la syntaxe des requêtes
FT.SEARCH index "(hybrid_filter_expression)=>[KNN num_neighbours @my_vector_hash_key $my_vector_query_param]" PARAMS 2 my_vector_query_param "query_embedding" DIALECT 2
index
: nom de l'index contenant votre champ vectoriel.(hybrid_filter_expression)
: expression de filtre hybride. Seuls les tags et les index numériques sont acceptés dans les expressions de filtre. Pour en savoir plus sur les expressions de filtre, consultez la section Requêtes hybrides.(*)
permet d'effectuer des requêtes qui ne nécessitent pas de filtrage.
=>
: sépare le filtre de la recherche vectorielle.[KNN num_neighbours @field $vector]
: expression de recherche KNN. Remplaceznum_neighbors
par le nombre de résultats choisi et@field
par le nom de votre champ vectoriel.PARAMS 2 my_vector_query_param "query_embedding"
:- La valeur
2
aprèsPARAMS
indique que deux arguments supplémentaires doivent être fournis. my_vector_query_param
est le nom du vecteur du paramètre de requête, comme indiqué dans l'expression de recherche KNN.- Remplacez
query_embedding
par votre vecteur de requête intégré.
- La valeur
DIALECT 2
: indique que vous utilisez la version 2 du dialecte de requête ou une version ultérieure (obligatoire pour la recherche vectorielle).
Requêtes hybrides
L'expression initiale placée entre parenthèses () est une expression de filtre. Les expressions de filtre vous permettent de filtrer des vecteurs lors de l'exécution de la recherche vectorielle. Une requête qui utilise une expression de filtre pour filtrer les résultats est appelée requête hybride. Toute combinaison d'index de balise et d'index numérique peut former une requête hybride.
Memorystore pour Valkey utilise deux approches pour filtrer les recherches vectorielles:
- Préfiltrage: le préfiltrage s'appuie sur des index secondaires (par exemple, la balise, les valeurs numériques) pour trouver d'abord les correspondances avec l'expression de filtre, quelle que soit la similarité vectorielle. Une fois les résultats filtrés calculés, une recherche par force brute est effectuée pour trier par similarité vectorielle.
- Filtrage intégré: le filtrage intégré exécute l'algorithme de recherche vectorielle (par exemple, HNSW), en ignorant les vecteurs trouvés qui ne correspondent pas au filtre.
Le préfiltrage est plus rapide lorsque l'espace de recherche filtré est beaucoup plus petit que l'espace de recherche d'origine. Lorsque l'espace de recherche filtré est volumineux, le filtrage intégré est plus rapide. Memorystore pour Valkey choisit automatiquement l'une des deux stratégies en fonction du filtre fourni.
Les expressions de filtre sont compatibles avec les tags et les index numériques.
Indice de balise
Les balises sont des champs de texte interprétés comme une liste de balises délimitées par un caractère séparateur. En général, les balises sont de petits ensembles de valeurs avec des valeurs possibles limitées, comme la couleur, le genre de livre, le nom de la ville ou l'auteur.
- Seuls les champs indexés peuvent être utilisés comme filtre de balise.
- Les champs TAG sont tokenisés par un caractère de séparation, qui est une virgule "," par défaut, mais configurable lors de la création de l'index.
- Aucune dérivation n'est effectuée lors de l'indexation d'un champ de balise.
- Seuls les préfiltres exacts et par préfixe peuvent être appliqués à un champ de balise. Les requêtes infixes et suffixées ne sont pas acceptées.
- Par défaut, les tags ne sont pas sensibles à la casse. Par exemple, "Bleu" et "BLEU" seront tous deux indexés en tant que "bleu" et donneront le même résultat dans une requête hybride.
- Les chaînes vides ne sont ni indexées ni interrogées.
- Lors de l'indexation et de la requête, tous les espaces blancs de fin sont supprimés.
Syntaxe
Ici, {
et }
font partie de la syntaxe, et |
est utilisé comme opérateur OU pour prendre en charge plusieurs balises:
@:{ | | ...}
Par exemple, la requête suivante renvoie les documents de couleur bleue OU noire OU verte.
@color:{blue | black | green}
Par exemple, la requête suivante renvoie les documents contenant "hello world" ou "hello universe".
@color:{hello world | hello universe}
Indice numérique
Les index numériques permettent de filtrer les requêtes afin de ne renvoyer que les valeurs comprises entre une valeur de début et une valeur de fin données.
- Les requêtes inclusives et exclusives sont acceptées.
- Pour les requêtes ouvertes, vous pouvez utiliser +inf et -inf pour indiquer les plages de début et de fin.
Par exemple, la requête suivante renvoie les livres publiés entre 2021 et 2024 (inclus). L'expression mathématique équivalente est 2021 <= year <= 2024
.
"@year:[2021 2024]"
La requête suivante renvoie les livres publiés entre 2021 (exclu) et 2024 (inclus). L'expression mathématique équivalente est 2021 < year <= 2024
.
@year:[(2021 2024]
La requête suivante renvoie les livres publiés avant 2024 (inclus). L'expression mathématique équivalente est year <= 2024
.
@year:[(-inf 2024]
La requête suivante renvoie les livres publiés après 2015 (inclus). L'expression mathématique équivalente est year >= 2015
.
@year:[2015 +inf]
Utilisez le tableau suivant comme guide pour mapper des expressions mathématiques sur le préfiltrage des requêtes:
Expression mathématique | Expression de filtre |
---|---|
min <= champ <= max | @field:[min max] |
min < champ <= max | @field:[(min max] |
min <= champ < max | @field:[min (max] |
min < champ < max | @field:[(min (max] |
champ => min | @field:[min +inf] |
champ > min | @field:[(min +inf] |
champ <= max | @field:[-inf max] |
champ < max | @field:[-inf (max] |
champ == val | @field:[val val] |
Opérateurs logiques
Vous pouvez utiliser plusieurs balises et champs numériques pour créer des requêtes complexes à l'aide d'opérateurs logiques.
Logical AND (Opérateur logique ET)
Pour définir une opération AND logique, insérez un espace entre les prédicats. Exemple :
query1 query2 query3
Logical OR (Opérateur logique OU)
Pour définir une opération OR logique, utilisez le caractère | entre les prédicats. Exemple :
query1 | query2 | query3
Négation logique
Vous pouvez inverser n'importe quelle requête en ajoutant -
avant chaque requête. Les requêtes négatives renvoient toutes les entrées qui ne correspondent pas à la requête. Cela inclut également les documents qui ne contiennent pas le champ.
Par exemple, une requête négative sur @genre:{comedy}
renvoie tous les livres qui ne sont pas des comédies ET tous les livres qui ne comportent pas de champ de genre.
La requête suivante renvoie tous les livres de genre "comédie" qui ne sont pas publiés entre 2015 et 2024 ou qui ne comportent pas de champ d'année:
@genre:[comedy] -@year:[2015 2024]
Exemples de combinaison d'opérateurs logiques
Vous pouvez combiner des opérateurs logiques pour créer des expressions de filtre complexes.
La requête suivante renvoie tous les livres de genre "comédie" ou "horreur" (ET) publiés entre 2015 et 2024:
@genre:[comedy|horror] @year:[2015 2024]
La requête suivante renvoie tous les livres appartenant au genre "comédie" ou "horreur" (OU) publiés entre 2015 et 2024:
@genre:[comedy|horror] | @year:[2015 2024]
La requête suivante renvoie tous les livres publiés entre 2015 et 2024 qui ne comportent pas de champ de genre ou dont le champ de genre n'est pas égal à "comédie" :
-@genre:[comedy] @year:[2015 2024]
Pour en savoir plus sur l'utilisation de cette fonctionnalité, consultez les informations sur FT.SEARCH.