FT.SEARCH

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'option NOCONTENT 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 que NOCONTENT.
  • 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 est LIMIT 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