FT.SEARCH

FT.SEARCH esegue la ricerca nell'indice con la query fornita e restituisce i valori specificati. Tieni presente che FT.SEARCH restituisce risultati per l'intero cluster, non solo per il nodo a cui viene eseguita la query.

Per informazioni dettagliate sulla sintassi delle query, consulta Sintassi delle query.

Sintassi

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 (obbligatorio): l'indice su cui vuoi eseguire una query.
  • query (obbligatorio): questa è la query. Per informazioni dettagliate sulla sintassi delle query, consulta Sintassi delle query.
  • NOCONTENT (facoltativo): restituisce solo gli ID documento ed esclude i contenuti.
  • TIMEOUT (facoltativo): consente di impostare un valore di timeout per il comando di ricerca.
  • PARAMS (facoltativo): il numero di coppie chiave-valore moltiplicato per due.
  • RETURN (facoltativo): specifica i campi che vuoi recuperare dai documenti, insieme a eventuali alias per i valori restituiti. Per impostazione predefinita, vengono restituiti tutti i campi, a meno che non sia impostata l'opzione NOCONTENT, nel qual caso non viene restituito alcun campo. Se num è impostato su 0, si comporta come NOCONTENT.
  • LIMIT (facoltativo): consente di scegliere la paginazione con un offset e un conteggio numerico. Se non utilizzi questo parametro, il valore predefinito è LIMIT 0 10, che restituisce al massimo 10 chiavi.
  • DIALECT 2 (facoltativo): specifica il tuo dialetto. L'unico dialetto supportato è il dialetto 2.

Restituisce il comando

  • Questo comando restituisce un array o un messaggio di errore. Gli elementi dell'array restituito rappresentano i risultati con la migliore corrispondenza della query. Ogni elemento dell'array contiene quanto segue:

  • La chiave hash della voce

  • Un array dei seguenti elementi:

    • Valore chiave: [$score_as ] score_value
    • Valore distanza
    • Nome attributo
    • Valore del vettore

    Se viene utilizzato NOCONTENT, gli elementi dell'array sono costituiti solo dagli ID documento.

Esempio 1: query di ricerca vettoriale semplice

Per questo esempio, supponiamo di creare un indice di ricerca delle proprietà in cui i clienti possono cercare le proprietà in base ad alcune funzionalità. Supponiamo di avere un elenco di proprietà con i seguenti attributi:

  • Descrizione: embedding vettoriale per una determinata proprietà.
  • Altri campi: ogni proprietà può avere anche altri metadati. Tuttavia, per semplicità, in questo esempio gli altri campi vengono ignorati.

Innanzitutto, creiamo un indice HNSW con la descrizione come campo vettoriale utilizzando il comando FT.CREATE:

FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2

Ora possiamo inserire alcune proprietà (questa operazione può essere eseguita anche prima della creazione dell'indice) utilizzando il comando 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?"

Ora possiamo eseguire query utilizzando il comando FT.SEARCH. La seguente query restituisce fino a cinque delle proprietà più simili al vettore di query fornito:

FT.SEARCH idx "*=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2

Risultato restituito:

 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

Esempio di codice

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();
});

Interfaccia a riga di comando

# 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

Esempio 2: ricerca di vettori con query ibride

Per questo esempio eseguiremo una query ibrida utilizzando altri due attributi denominati città e prezzo:

  • Descrizione: embedding vettoriale per una determinata proprietà.
  • Città: il nome della città.
  • Prezzo: costo della proprietà.

Innanzitutto, creiamo un indice con la descrizione come campo vettoriale, la città come campo tag e il prezzo come campo numerico:

FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2 city TAG price NUMERIC

Ora possiamo inserire alcune proprietà (questa operazione può essere eseguita anche prima della creazione dell'indice):

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

Ora possiamo eseguire query. La seguente query restituisce fino a cinque delle proprietà più simili al vettore di query fornito, filtrando solo quelle a BANGALORE con un prezzo inferiore a 100000:

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

Risultato restituito:

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

Per informazioni dettagliate sul formato della query di filtro, consulta la sezione Sintassi delle query.

Esempio di codice

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();
});

Interfaccia a riga di comando

# 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