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'opzioneNOCONTENT
, nel qual caso non viene restituito alcun campo. Se num è impostato su 0, si comporta comeNOCONTENT
.- (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