FT.SEARCH

FT.SEARCH cerca nell'indice con la query fornita e restituisce il valore i valori specificati. Tieni presente che FT.SEARCH restituisce i risultati per l'intero cluster, non solo per il nodo su cui è stata 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): questo indice su cui vuoi eseguire una query.
  • query (obbligatorio): questa è la tua 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.
  • (Facoltativo) PARAMS: 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.
  • (Facoltativo) LIMIT: consente di scegliere l'impaginazione con un offset e un conteggio numerico. Se non usi questo parametro, il valore predefinito è LIMIT 0 10, che restituisce al massimo 10 chiavi.
  • DIALECT 2 (facoltativo): specifica il dialetto. L'unico dialetto supportato è il dialetto 2.

Invio del comando

  • Questo comando restituisce un array o un messaggio di errore. Gli elementi del l'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 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à, altri campi vengono ignorati in questo esempio.

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 le 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 vettoriale con query ibride

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

  • Descrizione: incorporamento vettoriale per una determinata proprietà.
  • Città - 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 delle query. La seguente query restituisce fino a cinque delle proprietà più simili al vettore di query fornito, filtrando solo quelle in BANGALORE con un prezzo inferiore a 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

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