Les requêtes vectorielles fonctionnent en recherchant dans une base de données vectorielle les vecteurs qui correspondent le mieux à 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-plus proches voisins (KNN) : trouve les k vecteurs les plus proches de votre vecteur de requête.
- Voisin le plus proche approximatif (ANN) : trouve les k vecteurs les plus proches de votre vecteur de requête.
Pour utiliser KNN, les index doivent être créés avec le type d'index vectoriel FLAT. Avec KNN, les requêtes de recherche seront exactes, mais plus lentes. Pour utiliser ANN, les index doivent être créés avec le type d'index vectoriel HNSW. Avec ANN, les requêtes de recherche seront approximatives, mais plus rapides. La précision de l'ANN peut être améliorée 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 index numériques et de balises sont acceptés dans les expressions de filtre. Pour en savoir plus sur les expressions de filtre, consultez Requêtes hybrides.(*)
peut être utilisé pour exécuter des requêtes qui ne nécessitent pas de filtrage.
=>
: sépare le filtre de l'expression de recherche vectorielle.[KNN num_neighbours @field $vector]
: expression de recherche KNN. Remplaceznum_neighbors
par le nombre de résultats souhaité 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
correspond au nom du vecteur du paramètre de requête, tel qu'il est spécifié 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 ou ultérieure du dialecte de requête (obligatoire pour la recherche vectorielle).
Requêtes hybrides
L'expression initiale entre parenthèses () est une expression de filtre. Les expressions de filtre vous permettent de filtrer les vecteurs lors de l'exécution de l'expression de 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 tags et numériques peut former une requête hybride.
Memorystore for Redis Cluster utilise deux approches pour filtrer les expressions de recherche vectorielle :
- Préfiltrage : le préfiltrage s'appuie sur des index secondaires (par exemple, des tags ou des 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 les 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é devient plus rapide. Memorystore for Redis Cluster choisit automatiquement l'une des deux stratégies en fonction du filtre fourni.
Les expressions de filtre sont compatibles avec les index numériques et de tag.
Index des balises
Les tags sont des champs de texte interprétés comme une liste de tags délimités par un caractère de séparation. En général, les tags sont de petits ensembles de valeurs avec un nombre fini de valeurs possibles, comme la couleur, le genre d'un livre, le nom d'une ville ou un 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 qui peut être configuré lors de la création de l'index.
- Aucune racinisation n'est effectuée lors de l'indexation d'un champ de balise.
- Seuls les préfiltres de préfixe et exacts peuvent être appliqués à un champ de tag. Les requêtes avec suffixe ou infixe ne sont pas acceptées.
- Par défaut, les tags ne sont pas sensibles à la casse. Par exemple, "Bleu" et "BLEU" seront tous les deux indexés comme "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 l'interrogation, 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 renverra les documents dont la couleur est bleue, noire ou verte.
@color:{blue | black | green}
Par exemple, la requête suivante renverra les documents contenant "hello world" ou "hello universe".
@color:{hello world | hello universe}
Index numérique
Les index numériques permettent de filtrer les requêtes pour 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, +inf et -inf peuvent être utilisés pour exprimer les plages de début et de fin.
Par exemple, la requête suivante renverra 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 renverra 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 renverra les livres publiés avant 2024 (inclus). L'expression mathématique équivalente est year <= 2024
.
@year:[(-inf 2024]
La requête suivante renverra les livres publiés après 2015 (exclus). L'expression mathématique équivalente est year >= 2015
.
@year:[2015 +inf]
Utilisez le tableau suivant pour mapper les expressions mathématiques aux requêtes de préfiltrage :
Expression mathématique | Expression de filtre |
---|---|
min <= champ <= max | @field:[min max] |
min < field <= max | @field:[(min max] |
min <= field < max | @field:[min (max] |
min < field < max | @field:[(min (max] |
field => min | @field:[min +inf] |
field > min | @field:[(min +inf] |
field <= max | @field:[-inf max] |
field < max | @field:[-inf (max] |
field == 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 un AND logique, insérez un espace entre les prédicats. Exemple :
query1 query2 query3
Logical OR (Opérateur logique OU)
Pour définir un OR logique, utilisez le caractère "|" entre les prédicats. Exemple :
query1 | query2 | query3
Négation logique
Vous pouvez nier 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 comportent pas le champ.
Par exemple, une requête négative sur @genre:{comedy}
renverra tous les livres qui ne sont pas des comédies ET tous les livres qui n'ont pas de champ de genre.
La requête suivante renvoie tous les livres de la catégorie "comédie" qui n'ont pas été 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
Les opérateurs logiques peuvent être combinés pour former des expressions de filtre complexes.
La requête suivante renverra tous les livres de genre "comédie" OU "horreur" publiés entre 2015 et 2024 :
@genre:[comedy|horror] @year:[2015 2024]
La requête suivante renverra tous les livres de genre "comédie" ou "horreur" (OR) 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 n'ont pas de champ de genre ou dont le champ de genre n'est pas égal à "comedy" :
-@genre:[comedy] @year:[2015 2024]
Pour en savoir plus sur l'utilisation, consultez les informations sur FT.SEARCH.