FT.SEARCH durchsucht den Index mit der angegebenen Abfrage und gibt die angegebenen Werte zurück. FT.SEARCH gibt Ergebnisse für den gesamten Cluster zurück, nicht nur für den abgefragten Knoten.
Sie können FT.SEARCH auch für JSON-Dokumente verwenden. Um diese Funktion zu aktivieren,
erstellen Sie einen Index mit FT.CREATE für
Ihre JSON-Daten und geben Sie dann die Felder an, die Sie indexieren möchten.
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): Ihre Abfrage. Weitere Informationen zur Abfragesyntax finden Sie unter Abfragesyntax.NOCONTENT(optional): Gibt nur die Dokument-IDs zurück und schließt den Inhalt aus.TIMEOUT(optional): Hiermit können Sie einen Timeout-Wert für den Suchbefehl festlegen.PARAMS(optional): Die Anzahl der Schlüssel/Wert-Paare multipliziert mit zwei.RETURN(optional): Gibt die Felder an, die Sie aus Ihren Dokumenten abrufen möchten, sowie alle Aliase für die zurückgegebenen Werte. Standardmäßig werden alle Felder zurückgegeben, es sei denn, die OptionNOCONTENTist festgelegt. In diesem Fall werden keine Felder zurückgegeben. Wenn „num“ auf 0 gesetzt ist, verhält es sich genauso wie beiNOCONTENT.LIMIT(optional): Hiermit können Sie die Paginierung mit einem Offset und einer Anzahl auswählen. Wenn Sie diesen Parameter nicht verwenden, ist der StandardwertLIMIT 0 10. Dadurch werden maximal 10 Schlüssel zurückgegeben.DIALECT 2(optional): Gibt Ihren 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 am besten passenden Ergebnisse der Abfrage dar. Jedes Array-Element hat Folgendes:
Der Hash-Schlüssel des Eintrags
Ein Array mit Folgendem:
- Schlüsselwert: [$score_as ] score_value
- Entfernungswert
- Attributname
- Vektorwert
Wenn
NOCONTENTverwendet wird, bestehen die Array-Elemente nur aus den Dokument-IDs.
Beispiel 1: Einfache Vektorsuchabfrage
In diesem Beispiel erstellen wir einen Index für die Immobiliensuche, in dem Kunden anhand bestimmter Merkmale nach Immobilien suchen können. Angenommen, wir haben eine Liste von Immobilien mit den folgenden Attributen:
- Beschreibung: Vektoreinbettung für die angegebene Immobilie.
- Andere Felder: Jede Immobilie kann auch andere Metadaten haben. Aus Gründen der Einfachheit werden andere Felder in diesem Beispiel jedoch ignoriert.
Zuerst erstellen wir einen HNSW-Index mit der Beschreibung als Vektorfeld mit dem Befehl FT.CREATE:
FT.CREATE idx SCHEMA description VECTOR HNSW 6 TYPE FLOAT32 DIM 3 DISTANCE_METRIC L2
Jetzt können wir mit dem Befehl HSET einige Immobilien einfügen. Das kann auch vor der Indexerstellung erfolgen:
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 ähnlichsten Immobilien zum angegebenen Abfragevektor 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_redis_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_redis_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_redis_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 mit zwei zusätzlichen Attributen aus: „city“ und „price“:
- Beschreibung: Vektoreinbettung für die angegebene Immobilie.
- Stadt: Name der Stadt.
- Preis: Kosten der Immobilie.
Zuerst erstellen wir einen Index mit der Beschreibung als Vektorfeld, „city“ als Tag-Feld und „price“ 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 Immobilien einfügen. Das kann auch vor der Indexerstellung erfolgen:
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 ähnlichsten Immobilien zum angegebenen Abfragevektor zurück und filtert nur nach Immobilien in BANGALORE, die weniger als 100.000 kosten:
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 der Filterabfrage 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_redis_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_redis_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_redis_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