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): renvoie uniquement les ID de document et exclut les champs contenus.TIMEOUT
(facultatif): permet de définir une valeur de délai avant expiration pour la commande de recherche.PARAMS
(facultatif): nombre de paires clé-valeur multiplié par deux.RETURN
(facultatif): spécifie les champs que vous souhaitez extraire 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. Dans ce 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 une valeur un nombre. Si vous n'utilisez pas ce paramètre, la valeur par défaut estLIMIT 0 10
. qui renvoie un maximum de 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 de renvoyé représentent les résultats les plus pertinents de la requête. Chaque tableau comporte les éléments suivants:
Clé de hachage de l'entrée
Tableau des éléments suivants:
- Valeur clé : [$score_as ] score_value
- Valeur de distance
- Nom de l'attribut
- Valeur vectorielle
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 ayons une liste de propriétés 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é, d'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 semblables 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 des 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 semblables au vecteur de requête fourni, en filtrant uniquement celles de 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