FT.SEARCH
durchsucht den Index mit der angegebenen Abfrage und gibt die angegebenen Werte zurück. Beachten Sie, dass FT.SEARCH Ergebnisse für den gesamten Cluster zurückgibt, nicht nur für den abgefragten Knoten.
Weitere Informationen zur Abfragesyntax finden Sie unter Abfragesyntax.
Syntax
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
(erforderlich): Der Index, den Sie abfragen möchten.query
(erforderlich): Dies ist Ihre Abfrage. Weitere Informationen zur Abfragesyntax finden Sie unter Abfragesyntax.NOCONTENT
(optional): Es werden nur die Dokument-IDs zurückgegeben, der Inhalt wird ausgeschlossen.TIMEOUT
(optional): Hiermit können Sie einen Zeitüberschreitungswert für den Suchbefehl festlegen.PARAMS
(optional): Die Anzahl der Schlüssel/Wert-Paare multipliziert mit zwei.RETURN
(optional): Gibt die Felder an, die aus Ihren Dokumenten abgerufen werden sollen, sowie Aliasse für die zurückgegebenen Werte. Standardmäßig werden alle Felder zurückgegeben, es sei denn, die OptionNOCONTENT
ist festgelegt. In diesem Fall werden keine Felder zurückgegeben. Wenn „num“ auf „0“ festgelegt ist, verhält es sich genauso wieNOCONTENT
.LIMIT
(optional): Hiermit können Sie die Paginierung mit einem Offset und einer Zählung auswählen. Wenn Sie diesen Parameter nicht verwenden, ist der StandardwertLIMIT 0 10
. Dabei werden maximal 10 Schlüssel zurückgegeben.DIALECT 2
(optional): Gibt den Dialekt an. Der einzige unterstützte Dialekt ist Dialekt 2.
Befehlsrückgabe
Dieser Befehl gibt ein Array oder eine Fehlermeldung zurück. Die Elemente des zurückgegebenen Arrays stellen die besten Übereinstimmungen der Abfrage dar. Jedes Arrayelement hat Folgendes:
Der Hash-Schlüssel des Eintrags
Ein Array mit folgenden Elementen:
- Schlüsselwert: [$score_as ] score_value
- Entfernungswert
- Attributname
- Vektorwert
Wenn
NOCONTENT
verwendet wird, bestehen die Arrayelemente nur aus den Dokument-IDs.
Beispiel 1: Einfache Vektorsuchabfrage
Angenommen, wir erstellen einen Index für die Hotelsuche, in dem Kunden nach bestimmten Merkmalen suchen können. Angenommen, wir haben eine Liste von Unterkünften mit den folgenden Attributen:
- Beschreibung – Vektoreinbettung für die angegebene Property.
- Andere Felder: Jede Property kann auch andere Metadaten haben. Zur Vereinfachung werden in diesem Beispiel jedoch andere Felder ignoriert.
Zuerst erstellen wir mit dem Befehl FT.CREATE
einen HNSW-Index mit der Beschreibung als Vektorfeld:
FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2
Jetzt können wir mit dem Befehl HSET einige Eigenschaften einfügen (dies ist auch vor dem Erstellen des Index möglich):
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?"
Jetzt können wir Abfragen mit dem Befehl „FT.SEARCH“ ausführen. Die folgende Abfrage gibt bis zu fünf der dem angegebenen Abfragevektor am ähnlichsten stehenden Properties zurück:
FT.SEARCH idx "*=>[KNN 5 @description $query_vector]" PARAMS 2 query_vector "\xcd\xccL?\x00\x00\x00\x00\x00\x00\x00\x00" DIALECT 2
Zurückgegebenes Ergebnis:
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
Codebeispiel
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(); });
Befehlszeile
# 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
Beispiel 2: Vektorsuche mit Hybridabfragen
In diesem Beispiel führen wir eine Hybridabfrage durch und verwenden dazu die beiden zusätzlichen Attribute „Ort“ und „Preis“:
- Beschreibung – Vektoreinbettung für die angegebene Property.
- Ort: Name der Stadt.
- Preis – Kosten der Unterkunft.
Zuerst erstellen wir einen Index mit der Beschreibung als Vektorfeld, der Stadt als Tag-Feld und dem Preis als numerisches Feld:
FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2 city TAG price NUMERIC
Jetzt können wir einige Properties einfügen. Das ist auch vor der Indexerstellung möglich:
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
Jetzt können wir Abfragen ausführen. Die folgende Abfrage gibt bis zu fünf der Unterkünfte zurück, die dem angegebenen Abfragevektor am ähnlichsten sind. Dabei werden nur Unterkünfte in BANGALORE mit einem Preis unter 100.000 € berücksichtigt:
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
Zurückgegebenes Ergebnis:
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
Weitere Informationen zum Format von Filterabfragen finden Sie unter Abfragesyntax.
Codebeispiel
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(); });
Befehlszeile
# 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