Bei Vektorabfragen wird in einer Vektordatenbank nach Vektoren gesucht, die im gesamten Cluster am besten mit Ihrem Abfragevektor übereinstimmen. Auf dieser Seite finden Sie weitere Informationen dazu.
Ähnliche Vektoren finden
Bei Vektorsuchanfragen werden zwei Strategien verwendet:
- K-Nearest Neighbor (KNN): Hiermit werden die k nächstgelegenen Vektoren zum Abfragevektor ermittelt.
- Approximate Nearest Neighbor (ANN): Die k nächsten Vektoren zum Abfragevektor werden ermittelt.
Wenn Sie KNN verwenden möchten, sollten Indexe mit dem Vektorindextyp FLAT erstellt werden. Bei KNN sind Suchanfragen zwar genau, aber langsamer. Wenn Sie ANN verwenden möchten, sollten Indexe mit dem HNSW-Vektorindextyp erstellt werden. Mit ANN sind Suchanfragen zwar ungefähr, aber schneller. Die Genauigkeit von ANN kann durch Anpassung der HNSW-Indexparameter und des EF_RUNTIME-Parameters in der Abfrage verbessert werden.
Aufschlüsselung der Abfragesyntax
FT.SEARCH index "(hybrid_filter_expression)=>[KNN num_neighbours @my_vector_hash_key $my_vector_query_param]" PARAMS 2 my_vector_query_param "query_embedding" DIALECT 2
index
: Der Name des Index, der Ihr Vektorfeld enthält.(hybrid_filter_expression)
: Dies ist der Hybridfilterausdruck. In Filterausdrücken werden nur Tag- und numerische Indizes unterstützt. Weitere Informationen zu Filterausdrücken finden Sie unter Hybridabfragen.- Mit
(*)
können Abfragen ausgeführt werden, für die kein Filter erforderlich ist.
- Mit
=>
: Trennt den Filter von der Vektorsuche.[KNN num_neighbours @field $vector]
: Der KNN-Suchausdruck. Ersetzen Sienum_neighbors
durch die gewünschte Anzahl von Ergebnissen und@field
durch den Namen Ihres Vektorfelds.PARAMS 2 my_vector_query_param "query_embedding"
:- Der Wert
2
nachPARAMS
gibt an, dass zwei zusätzliche Argumente angegeben werden müssen. my_vector_query_param
ist der Name des Abfrageparametervektors, wie im KNN-Suchausdruck angegeben.- Ersetzen Sie
query_embedding
durch Ihren eingebetteten Abfragevektor.
- Der Wert
DIALECT 2
: Gibt an, dass Sie die Abfragespracheversion 2 oder höher verwenden (erforderlich für die Vektorsuche).
Hybridabfragen
Der erste Ausdruck in den Klammern () ist ein Filterausdruck. Mit Filterausdrücken können Sie Vektoren während der Ausführung der Vektorsuche filtern. Eine Abfrage, bei der Ergebnisse mit einem Filterausdruck gefiltert werden, wird als Hybridabfrage bezeichnet. Eine Hybridabfrage kann aus einer beliebigen Kombination von Tag- und numerischen Indexen bestehen.
Memorystore for Valkey verwendet zwei Ansätze zum Filtern von Vektorsuchen:
- Vorabfilterung: Bei der Vorabfilterung werden sekundäre Indizes (z.B. Tag, numerisch) verwendet, um zuerst die Übereinstimmungen mit dem Filterausdruck zu finden, unabhängig von der Vektorähnlichkeit. Sobald die gefilterten Ergebnisse berechnet wurden, wird eine Brute-Force-Suche durchgeführt, um nach Vektorähnlichkeit zu sortieren.
- Inline-Filterung: Bei der Inline-Filterung wird der Vektorsuchalgorithmus (z.B. HNSW) ausgeführt und gefundene Vektoren, die nicht mit dem Filter übereinstimmen, werden ignoriert.
Die Vorabfilterung ist schneller, wenn der gefilterte Suchraum viel kleiner als der ursprüngliche Suchraum ist. Je größer der gefilterte Suchraum ist, desto schneller wird das Inline-Filtern. Memorystore for Valkey wählt anhand des angegebenen Filters automatisch eine der beiden Strategien aus.
Filterausdrücke unterstützen sowohl Tag- als auch numerische Indexe.
Tag-Index
Tags sind Textfelder, die als Liste von Tags interpretiert werden, die durch ein Trennzeichen voneinander getrennt sind. Im Allgemeinen sind Tags kleine Wertemengen mit einer begrenzten Anzahl möglicher Werte wie Farbe, Buchgenre, Name der Stadt oder Autor.
- Nur indexierte Felder können als Tag-Filter verwendet werden.
- TAG-Felder werden durch ein Trennzeichen tokenisiert, das standardmäßig ein Komma „,“ ist, aber bei der Indexerstellung konfiguriert werden kann.
- Bei der Indexierung eines Tag-Felds wird keine Stemming-Behandlung durchgeführt.
- Für ein Tag-Feld können nur Präfix- und exakte Vorabfilter verwendet werden. Suffix- und Infixabfragen werden nicht unterstützt.
- Bei Tags wird standardmäßig nicht zwischen Groß- und Kleinschreibung unterschieden. Beispielsweise werden „blau“ und „BLAU“ beide als „blau“ indexiert und führen bei einer Hybridabfrage zum selben Ergebnis.
- Leere Strings werden weder indexiert noch abgefragt.
- Bei der Indexierung und Abfrage werden alle nachgestellten Leerzeichen entfernt.
Syntax
Hier sind {
und }
Teil der Syntax und |
wird als OR-Operator verwendet, um mehrere Tags zu unterstützen:
@:{ | | ...}
Mit der folgenden Abfrage werden beispielsweise Dokumente mit blauer ODER schwarzer ODER grüner Farbe zurückgegeben.
@color:{blue | black | green}
Mit der folgenden Abfrage werden beispielsweise Dokumente zurückgegeben, die „Hallo Welt“ oder „Hallo Universum“ enthalten.
@color:{hello world | hello universe}
Numerischer Index
Mithilfe numerischer Indizes können Abfragen so gefiltert werden, dass nur Werte zurückgegeben werden, die zwischen einem bestimmten Start- und Endwert liegen.
- Sowohl einschließende als auch ausschließende Abfragen werden unterstützt.
- Bei offenen Abfragen können „+inf“ und „-inf“ für Start- und Endbereiche verwendet werden.
Mit der folgenden Abfrage werden beispielsweise Bücher zurückgegeben, die zwischen 2021 und 2024 veröffentlicht wurden (einschließlich). Der entsprechende mathematische Ausdruck ist 2021 <= year <= 2024
.
"@year:[2021 2024]"
Mit der folgenden Abfrage werden Bücher zurückgegeben, die zwischen 2021 (ohne) und 2024 (einschließlich) veröffentlicht wurden. Der entsprechende mathematische Ausdruck ist 2021 < year <= 2024
.
@year:[(2021 2024]
Die folgende Abfrage gibt Bücher zurück, die vor 2024 (einschließlich) veröffentlicht wurden. Der entsprechende mathematische Ausdruck ist year <= 2024
.
@year:[(-inf 2024]
Die folgende Abfrage gibt Bücher zurück, die nach 2015 veröffentlicht wurden. Der entsprechende mathematische Ausdruck ist year >= 2015
.
@year:[2015 +inf]
In der folgenden Tabelle finden Sie eine Übersicht dazu, wie mathematische Ausdrücke Abfragen für die Vorabfilterung zugeordnet werden:
Mathematischer Ausdruck | Filterausdruck |
---|---|
min <= Feld <= max | @field:[min max] |
min < Feld <= max | @field:[(min max] |
min <= field < max | @field:[min (max] |
min < field < max | @field:[(min (max] |
Feld => min | @field:[min +inf] |
Feld > min | @field:[(min +inf] |
Feld <= max | @field:[-inf max] |
Feld < max | @field:[-inf (max] |
field == val | @field:[val val] |
Logische Operatoren
Mithilfe mehrerer Tags und numerischer Felder können Sie komplexe Abfragen mit logischen Operatoren erstellen.
Logisches AND
Wenn Sie ein logisches UND festlegen möchten, setzen Sie ein Leerzeichen zwischen die Prädikate. Beispiel:
query1 query2 query3
Logisches OR
Verwenden Sie das Zeichen „|“, um ein logisches OR festzulegen. Beispiel:
query1 | query2 | query3
Logische Negation
Jede Suchanfrage kann negiert werden, indem Sie vor jede Suchanfrage -
einfügen. Bei ausschließenden Abfragen werden alle Einträge zurückgegeben, die nicht mit der Abfrage übereinstimmen. Das gilt auch für Dokumente, die das Feld nicht enthalten.
Eine negative Abfrage für @genre:{comedy}
gibt beispielsweise alle Bücher zurück, die keine Komödie sind UND keine Genres haben.
Mit der folgenden Abfrage werden alle Bücher mit dem Genre „Komödie“ zurückgegeben, die nicht zwischen 2015 und 2024 veröffentlicht wurden oder kein Jahresfeld haben:
@genre:[comedy] -@year:[2015 2024]
Beispiele für die Kombination logischer Operatoren
Logische Operatoren können kombiniert werden, um komplexe Filterausdrücke zu bilden.
Die folgende Abfrage gibt alle Bücher mit dem Genre „Komödie“ oder „Horror“ (AND) zurück, die zwischen 2015 und 2024 veröffentlicht wurden:
@genre:[comedy|horror] @year:[2015 2024]
Die folgende Abfrage gibt alle Bücher zurück, die zwischen 2015 und 2024 veröffentlicht wurden und dem Genre „Komödie“ oder „Horror“ (ODER) zugewiesen sind:
@genre:[comedy|horror] | @year:[2015 2024]
Mit der folgenden Abfrage werden alle Bücher zurückgegeben, die zwischen 2015 und 2024 veröffentlicht wurden und entweder kein Genrefeld haben oder deren Genrefeld nicht „Komödie“ lautet:
-@genre:[comedy] @year:[2015 2024]
Weitere Informationen zur Verwendung finden Sie unter FT.SEARCH.