Syntaxe des requêtes

Les requêtes de vecteur fonctionnent en recherchant dans une base de données vectorielles pour trouver des vecteurs le mieux adapté à 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 du vecteur de votre requête.
  • Voisin le plus proche (ANN) : trouve 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 réseaux de neurones artificiels, 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.

    • (*) peut être utilisé pour 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. Remplacez num_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ès PARAMS indique que deux arguments supplémentaires doivent être fournis.
    • my_vector_query_param est le nom du vecteur du paramètre de requête, tel que spécifié dans l'expression de recherche KNN.
    • Remplacez query_embedding par votre vecteur de requête intégré.
  • DIALECT 2: indique que vous utilisez le dialecte de requête 2 ou 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 les 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 numériques et de tags peut former une requête hybride.

Memorystore for Valkey utilise deux approches pour filtrer les recherches vectorielles:

  1. 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é des vecteurs. Une fois les résultats filtrés calculés, une recherche par force brute est effectuée pour trier les résultats par similarité vectorielle.
  2. 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 index numériques et avec balise.

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 tag.
  • 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éfixes et les pré-filtres exacts peuvent être appliqués à un champ de tag. Les requêtes infixe et suffixe 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 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 accepter plusieurs balises:

@:{  |  | ...}

Par exemple, la requête suivante renverra des documents en bleu OU noir OU vert.

@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 (exclus). 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 @champ:[min max]
min < champ <= max @field:[(min max]
min <= champ < max @field:[min (max])
min < champ < maximum @field:[(min (max]
champ => min @champ:[min +inf]
champ > min @field:[(min +inf]
champ <= max @field:[-inf max]
champ < maximum @field:[-inf (max]
champ == val @field:[val val]

Opérateurs logiques

Vous pouvez utiliser plusieurs balises et champs numériques pour élaborer des requêtes complexes à l'aide de les 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 un opérateur logique "OR", utilisez la méthode "|" entre les prédicats. Exemple :

query1 | query2 | query3
Négation logique

Vous pouvez annuler une requête en ajoutant - devant 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

Les opérateurs logiques peuvent être combinés pour former des expressions de filtre complexes.

La requête suivante renvoie tous les livres contenant le mot "comedy" ou "horreur" genre (AND) publié 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 qui n'ont pas de champ de genre ou qui présentent un champ de genre différent de "comedy" qui sont publiés entre 2015 et 2024:

-@genre:[comedy] @year:[2015 2024]

Consultez les informations sur FT.SEARCH pour en savoir plus sur l'utilisation.