Abfragesyntax

Bei Vektorabfragen wird in einer Vektordatenbank nach Vektoren gesucht, die am besten auf Ihren Abfragevektor im gesamten Cluster abgestimmt. 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ächsten Vektoren zum Abfragevektor ermittelt.
  • Ungefähre nächste Nachbarn (ANN): Findet die ungefähren k Vektoren, die Ihrem Abfragevektor am nächsten sind.

Um KNN zu verwenden, sollten Indexe mit dem Vektorindextyp FLAT erstellt werden. Mit KNN sind Suchanfragen exakt, aber langsamer. Um ANN zu verwenden, sollten Indexe mit dem HNSW-Vektorindextyp erstellt werden. Mit ANN sind Suchanfragen zwar ungefähr, aber schneller. Die ANN-Genauigkeit kann durch Anpassen 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 Indexe unterstützt. Weitere Informationen zu Filterausdrücken finden Sie unter Hybridabfragen.

    • Mit (*) können Abfragen ausgeführt werden, die keine Filterung erfordern.
  • =>: Trennt den Filter von der Vektorsuche.

  • [KNN num_neighbours @field $vector]: Der KNN-Suchausdruck. Ersetzen Sie num_neighbors durch die ausgewählte Anzahl von Ergebnissen und @field durch den Namen Ihres Vektorfelds.

  • PARAMS 2 my_vector_query_param "query_embedding":

    • Der Wert 2 nach PARAMS 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.
  • DIALECT 2: Gibt an, dass Sie die Abfragesprache Version 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:

  1. Vorfilterung: Beim Vorfiltern werden sekundäre Indexe (z.B. Tag, numerisch) verwendet, um unabhängig von der Vektorähnlichkeit zuerst Übereinstimmungen mit dem Filterausdruck zu finden. Nachdem die gefilterten Ergebnisse berechnet wurden, wird eine Brute-Force-Suche durchgeführt, um nach der Vektorähnlichkeit zu sortieren.
  2. 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.

Das Vorfiltern ist schneller, wenn der gefilterte Suchbereich viel kleiner als der ursprüngliche Suchbereich ist. Wenn der gefilterte Suchbereich groß ist, lässt sich die Inline-Filterung schneller ausführen. Memorystore for Valkey wählt anhand des angegebenen Filters automatisch zwischen den 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 Mengen von Werten mit endlichen möglichen Werten wie Farbe, Buchgenre, Städtename oder Autor.

  • Nur indexierte Felder können als Tag-Filter verwendet werden.
  • TAG-Felder werden durch ein Trennzeichen (,) tokenisiert ist standardmäßig aktiviert, kann aber während der Indexerstellung konfiguriert werden.
  • 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.
  • Standardmäßig wird bei Tags 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

Numerische Indexe ermöglichen es, Abfragen so zu filtern, dass nur Werte zurückgegeben werden, die zwischen einem bestimmten Start- und Endwert liegen.

  • Sowohl einschließende als auch exklusive Abfragen werden unterstützt.
  • Bei offenen Abfragen können Start- und Endbereiche mit +inf und -inf ausgedrückt 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]"

Die folgende Abfrage gibt Bücher zurück, die zwischen 2021 (exklusiv) 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 @Feld:[(Min. max.]
min <= Feld < Max. @field:[min (max.)
Min. < Feld < Max. @field:[(min (max]
Feld => Min. @field:[min +inf]
Feld > min @field:[(min +inf]
Feld <= Max @Feld:[-inf max]
Feld < Max. @field:[-inf (max]
Feld == val @Feld:[Wert]

Logische Operatoren

Es können mehrere Tags und numerische Felder verwendet werden, um komplexe Abfragen mithilfe von logischen Operatoren.

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 Abfrage kann negiert werden, indem - jeder Abfrage vorangestellt wird. Bei negativen Suchanfragen werden alle Einträge zurückgegeben, die nicht mit der Suchanfrage übereinstimmen. Dies 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.

Durch die folgende Abfrage werden alle Bücher mit „comedy“ zurückgegeben Genre, das zwischen 2015 und 2024 nicht veröffentlicht wurde oder bei dem kein Feld für die Jahresangabe fehlt:

@genre:[comedy] -@year:[2015 2024]
Beispiele für die Kombination logischer Operatoren

Logische Operatoren können zu komplexen Filterausdrücken kombiniert werden.

Durch die folgende Abfrage werden alle Bücher mit „comedy“ zurückgegeben oder „Horror“ Genre (UND), das zwischen 2015 und 2024 veröffentlicht wurde:

@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]

Informationen zur Verwendung finden Sie unter FT.SEARCH.