Bei Vektorabfragen wird eine Vektordatenbank durchsucht, um Vektoren zu finden, die im gesamten Cluster am besten mit Ihrem Abfragevektor übereinstimmen. Auf dieser Seite erfahren Sie, wie das funktioniert.
Ähnliche Vektoren finden
Bei Vektorsuchabfragen werden zwei Strategien verwendet:
- K-Nearest Neighbors (KNN): Findet die k nächsten Vektoren zu Ihrem Abfragevektor.
- Approximate Nearest Neighbors (ANN): Findet die ungefähr k nächsten Vektoren zu Ihrem Abfragevektor.
Wenn Sie KNN verwenden möchten, müssen Indexe mit dem Vektorindex-Typ FLAT erstellt werden. Bei KNN sind Suchabfragen genau, aber langsamer. Wenn Sie ANN verwenden möchten, müssen Indexe mit dem Vektorindex-Typ HNSW erstellt werden. Bei ANN sind Suchabfragen ungefähr, aber schneller. Die ANN-Genauigkeit kann verbessert werden, indem Sie die HNSW-Indexparameter und den Parameter EF_RUNTIME in der Abfrage anpassen.
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 hybride Filterausdruck. In Filterausdrücken werden nur Tag- und numerische Indexe unterstützt. Weitere Informationen zu Filterausdrücken finden Sie unter Hybride Abfragen.(*)kann verwendet werden, um Abfragen auszuführen, für die keine Filterung erforderlich ist.
=>: Trennt den Filter von der Vektorsuche.[KNN num_neighbours @field $vector]: Der KNN-Suchausdruck. Ersetzen Sienum_neighborsdurch die ausgewählte Anzahl von Ergebnissen und@fielddurch den Namen Ihres Vektorfelds.PARAMS 2 my_vector_query_param "query_embedding":- Der Wert
2nachPARAMSgibt an, dass zwei zusätzliche Argumente angegeben werden müssen. my_vector_query_paramist der Vektorname des Abfrageparameters, wie im KNN-Suchausdruck angegeben.- Ersetzen Sie
query_embeddingdurch Ihren eingebetteten Abfragevektor.
- Der Wert
DIALECT 2: Gibt an, dass Sie die Abfragesprache Version 2 oder höher verwenden (für die Vektorsuche erforderlich).
Hybride Abfragen
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, die einen Filterausdruck zum Filtern von Ergebnissen verwendet, wird als hybride Abfrage bezeichnet. Jede Kombination aus Tag- und numerischen Indexen kann eine hybride Abfrage bilden.
Memorystore for Valkey verwendet zwei Ansätze zum Filtern von Vektorsuchen:
- Vorabfilterung: Bei der Vorabfilterung werden sekundäre Indexe (z.B. Tag, numerisch) verwendet, um zuerst die Übereinstimmungen mit dem Filterausdruck unabhängig von der Vektorähnlichkeit zu finden. Nachdem 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 ignoriert, die nicht mit dem Filter übereinstimmen.
Die Vorabfilterung ist schneller, wenn der gefilterte Suchraum viel kleiner als der ursprüngliche Suchraum ist. Wenn der gefilterte Suchraum groß ist, ist die Inline-Filterung schneller. Memorystore for Valkey wählt automatisch zwischen den beiden Strategien basierend auf dem angegebenen Filter 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 getrennt sind. Im Allgemeinen sind Tags kleine Wertemengen mit einer begrenzten Anzahl möglicher Werte wie Farbe, Buchgenre, Stadtname oder Autor.
- Nur indexierte Felder können als Tag-Filter verwendet werden.
- TAG-Felder werden durch ein Trennzeichen tokenisiert. Standardmäßig ist das ein Komma „,“, kann aber bei der Indexerstellung konfiguriert werden.
- Beim Indexieren eines Tag-Felds wird keine Stemming-Funktion ausgeführt.
- Für ein Tag-Feld können nur Präfix- und genaue Vorabfilter ausgeführt werden. Suffix- und Infix-Abfragen werden nicht unterstützt.
- Standardmäßig wird bei Tags nicht zwischen Groß- und Kleinschreibung unterschieden. Beispielsweise werden sowohl „Blue“ als auch „BLUE“ als „blue“ indexiert und liefern in einer hybriden Abfrage dasselbe Ergebnis.
- Leere Strings werden weder indexiert noch abgefragt.
- Beim Indexieren und Abfragen werden alle nachgestellten Leerzeichen entfernt.
Syntax
Hier sind { und } Teil der Syntax und | wird als OR-Operator verwendet, um mehrere Tags zu unterstützen:
@:{ | | ...}
Die folgende Abfrage gibt beispielsweise Dokumente mit blauer, schwarzer oder grüner Farbe zurück.
@color:{blue | black | green}
Ein weiteres Beispiel: Die folgende Abfrage gibt Dokumente zurück, die „Hallo Welt“ oder „Hallo Universum“ enthalten.
@color:{hello world | hello universe}
Numerischer Index
Mit numerischen Indexen können Sie Abfragen so filtern, 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 Sie mit „+inf“ und „-inf“ Start- und Endbereiche angeben.
Die folgende Abfrage gibt beispielsweise Bücher zurück, die zwischen 2021 und 2024 veröffentlicht wurden (beide Jahre einschließlich). Der entsprechende mathematische Ausdruck ist 2021 <= year <= 2024.
"@year:[2021 2024]"
Die folgende Abfrage gibt Bücher zurück, die zwischen 2021 (ausschließlich) 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 veröffentlicht wurden (einschließlich). Der entsprechende mathematische Ausdruck ist year <= 2024.
@year:[(-inf 2024]
Die folgende Abfrage gibt Bücher zurück, die nach 2015 veröffentlicht wurden (ausschließlich). Der entsprechende mathematische Ausdruck ist year >= 2015.
@year:[2015 +inf]
In der folgenden Tabelle finden Sie eine Anleitung zum Zuordnen mathematischer Ausdrücke zu Vorabfilterungsabfragen:
| Mathematischer Ausdruck | Filterausdruck |
|---|---|
| min <= field <= max | @field:[min max] |
| min < field <= max | @field:[(min max] |
| min <= field < max | @field:[min (max] |
| min < field < max | @field:[(min (max] |
| field => min | @field:[min +inf] |
| field > min | @field:[(min +inf] |
| field <= max | @field:[-inf max] |
| field < max | @field:[-inf (max] |
| field == val | @field:[val val] |
Logische Operatoren
Mit mehreren Tags und numerischen Feldern können Sie mithilfe logischer Operatoren komplexe Abfragen erstellen.
Logisches AND
Um ein logisches AND festzulegen, verwenden Sie ein Leerzeichen zwischen den Prädikaten. Beispiel:
query1 query2 query3
Logisches OR
Um ein logisches OR festzulegen, verwenden Sie das Zeichen „|“ zwischen den Prädikaten. Beispiel:
query1 | query2 | query3
Logische Negation
Jede Abfrage kann negiert werden, indem Sie vor jede Abfrage ein - setzen. Negative Abfragen geben alle Einträge zurück, die nicht mit der Abfrage übereinstimmen. Dazu gehören auch Dokumente, die das Feld nicht enthalten.
Beispielsweise gibt eine negative Abfrage für @genre:{comedy} alle Bücher zurück, die nicht dem Genre „Comedy“ entsprechen, UND alle Bücher, die kein Genre-Feld haben.
Die folgende Abfrage gibt alle Bücher mit dem Genre „Comedy“ zurück, die nicht zwischen 2015 und 2024 veröffentlicht wurden oder kein Feld für das Jahr 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 „Comedy“ oder „Horror“ zurück, die zwischen 2015 und 2024 veröffentlicht wurden:
@genre:[comedy|horror] @year:[2015 2024]
Die folgende Abfrage gibt alle Bücher mit dem Genre „Comedy“ oder „Horror“ 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 entweder kein Genre-Feld haben oder ein Genre-Feld haben, das nicht „Comedy“ entspricht, und die zwischen 2015 und 2024 veröffentlicht wurden:
-@genre:[comedy] @year:[2015 2024]
Informationen zur Verwendung finden Sie unter FT.SEARCH.