FT.SEARCH
recherche dans l'index avec la requête fournie et renvoie les valeurs spécifiées. Notez que FT.SEARCH renvoie des résultats pour l'ensemble du cluster, et pas seulement pour le nœud interrogé.
Pour en savoir plus sur la syntaxe des requêtes, consultez Syntaxe des requêtes.
Syntaxe
FT.SEARCH index query [NOCONTENT] [TIMEOUT timeout] [PARAMS nargs name value [ name value ...]] [RETURN num field [AS alias] [ field [AS alias] ... ]] [LIMIT offset num] DIALECT 2
index
(obligatoire): index que vous souhaitez interroger.query
(obligatoire): il s'agit de votre requête. Pour en savoir plus sur la syntaxe des requêtes, consultez Syntaxe des requêtes.NOCONTENT
(facultatif): cette valeur renvoie uniquement les ID de document et exclut le contenu.TIMEOUT
(facultatif): permet de définir une valeur de délai avant expiration pour la commande de recherche.PARAMS
(facultatif): double du nombre de paires clé-valeur.RETURN
(facultatif): spécifie les champs que vous souhaitez récupérer à partir de vos documents, ainsi que les alias des valeurs renvoyées. Par défaut, tous les champs sont renvoyés, sauf si l'optionNOCONTENT
est définie, auquel cas aucun champ n'est renvoyé. Si num est défini sur 0, il se comporte de la même manière queNOCONTENT
.LIMIT
(facultatif): permet de choisir la pagination avec un décalage et un nombre. Si vous n'utilisez pas ce paramètre, la valeur par défaut estLIMIT 0 10
, qui renvoie au maximum 10 clés.DIALECT 2
(facultatif): spécifie votre dialecte. Le seul dialecte accepté est le dialecte 2.
Retour de commande
Cette commande renvoie un tableau ou un message d'erreur. Les éléments du tableau renvoyé représentent les résultats les mieux adaptés de la requête. Chaque élément du tableau comporte les éléments suivants:
Clé de hachage d'entrée
Tableau des éléments suivants:
- Valeur clé: [$score_as ] score_value
- Valeur de la distance
- Nom de l'attribut
- Valeur du vecteur
Si
NOCONTENT
est utilisé, les éléments du tableau ne contiennent que les ID de document.
Exemple 1: Requête de recherche vectorielle simple
Pour cet exemple, supposons que nous créions un indice de recherche de propriétés permettant aux clients de rechercher des propriétés en fonction de certaines caractéristiques. Supposons que nous disposions d'une liste d'établissements avec les attributs suivants:
- Description : représentation vectorielle continue pour une propriété donnée.
- Autres champs : chaque propriété peut également comporter d'autres métadonnées. Toutefois, par souci de simplicité, les autres champs sont ignorés dans cet exemple.
Nous commençons par créer un indice HNSW avec la description en tant que champ vectoriel à l'aide de la commande FT.CREATE
:
FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2
Nous pouvons maintenant insérer quelques propriétés (cela peut également être fait avant la création de l'index) à l'aide de la commande HSET:
HSET p1 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?" HSET p2 description "\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00" HSET p3 description "\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00" HSET p4 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?" HSET p5 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?"
Nous pouvons maintenant effectuer des requêtes à l'aide de la commande FT.SEARCH. La requête suivante renvoie jusqu'à cinq des propriétés les plus similaires au vecteur de requête fourni:
FT.SEARCH idx "*=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
Résultat renvoyé:
1) (integer) 5 2) p5 3) 1) __description_score 2) 1.6400001049 3) description 4) \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80? 4) p4 5) 1) __description_score 2) 1.6400001049 3) description 4) \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80? 6) p2 7) 1) __description_score 2) 1.6400001049 3) description 4) \x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00 8) p1 9) 1) __description_score 2) 1.6400001049 3) description 4) \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80? 10) p3 11) 1) __description_score 2) 0.0399999953806 3) description 4) \x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00
Exemple de code
Python
# Before running, ensure you have installed redis-py: # pip install redis import redis client = redis.cluster.RedisCluster(host='your_server_host', port=6379) result = client.execute_command('FT.SEARCH', 'idx', '*=>[KNN 5 @description $query_vector]', 'PARAMS', '2', 'query_vector', '"\xcd\xccL?\x00\x00\x00\x00"', 'DIALECT', '2') print(result)
NodeJS
# Before running, ensure you have installed ioredis: # npm install ioredis const Redis = require("ioredis"); const redis = new Redis.Cluster([ { port: 6379, host: "your_server_host", }, ]); redis.call("FT.SEARCH", "idx", "*=>[KNN 5 @description $query_vector]", "PARAMS", "2", "query_vector", "\xcd\xccL?\x00\x00\x00\x00\x00\x00", "DIALECT", "2").then(result => { console.log(result); redis.disconnect(); });
CLI
# Before running, ensure you have install redis-cli redis-cli -h your_server_host -p 6379 FT.SEARCH idx "(*)=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
Exemple 2: Recherche vectorielle avec les requêtes hybrides
Pour cet exemple, nous allons effectuer une requête hybride à l'aide de deux attributs supplémentaires nommés "ville" et "prix" :
- Description : représentation vectorielle continue pour une propriété donnée.
- Ville : nom de la ville.
- Prix : coût de la propriété.
Tout d'abord, nous créons un indice avec la description en tant que champ vectoriel, la ville en tant que champ de balise et le prix en tant que champ numérique:
FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2 city TAG price NUMERIC
Nous pouvons maintenant insérer quelques propriétés (cela peut également être fait avant la création de l'index):
HSET p1 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?" city "NEW YORK" price 500000 HSET p2 description "\x00\x00\x00\x00\x00\x00\x80?\x00\x00\x00\x00" city "NEW JERSEY" price 400000 HSET p3 description "\x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00" city "BANGALORE" price 60000 HSET p4 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?" city "NEW YORK" price 600000 HSET p5 description "\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80?" city "BANGALORE" price 75000
Nous pouvons maintenant effectuer des requêtes. La requête suivante renvoie jusqu'à cinq des propriétés les plus similaires au vecteur de requête fourni, en filtrant uniquement celles situées à BANGALORE dont le prix est inférieur à 100 000:
FT.SEARCH idx "(@city:{BANGALORE} @price:[-inf 100000])=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
Résultat renvoyé:
1) (integer) 2 2) p5 3) 1) __description_score 2) 1.6400001049 3) city 4) BANGALORE 5) price 6) 75000 7) description 8) \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x80? 4) p3 5) 1) __description_score 2) 0.0399999953806 3) city 4) BANGALORE 5) price 6) 60000 7) description 8) \x00\x00\x80?\x00\x00\x00\x00\x00\x00\x00\x00
Pour en savoir plus sur le format de la requête de filtre, consultez la section Syntaxe des requêtes.
Exemple de code
Python
# Before running, ensure you have installed redis-py: # pip install redis import redis client = redis.cluster.RedisCluster(host='your_server_host', port=6379) result = client.execute_command('FT.SEARCH', 'idx', '(@city:{BANGALORE} @price:[-inf 100000])=>[KNN 5 @description $query_vector]', 'PARAMS', '2', 'query_vector', '"\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00"', 'DIALECT', '2') print(result)
NodeJS
# Before running, ensure you have installed ioredis: # npm install ioredis const Redis = require("ioredis"); const redis = new Redis.Cluster([ { port: 6379, host: "your_server_host", }, ]); redis.call("FT.SEARCH", "idx", "(@city:{BANGALORE} @price:[-inf 100000])=>[KNN 5 @description $query_vector]", "PARAMS", "2", "query_vector", "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00", "DIALECT", "2").then(result => { console.log(result); redis.disconnect(); });
CLI
# Before running, ensure you have install redis-cli redis-cli -h your_server_host -p 6379 FT.SEARCH idx "(@city:{BANGALORE} @price:[-inf 100000])=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2