Abfragesyntax

Bei Vektoranfragen wird eine Vektordatenbank durchsucht, um Vektoren zu finden, die über den gesamten Cluster hinweg am besten mit Ihrem Anfragevektor übereinstimmen. Auf dieser Seite finden Sie weitere Informationen dazu.

Ähnliche Vektoren finden

Für Vektorsuche-Anfragen werden zwei Strategien verwendet:

  • K-Nearest Neighbors (KNN): Findet die k Vektoren, die Ihrem Anfragevektor am nächsten sind.
  • Approximate Nearest Neighbors (ANN): Findet die ungefähren k nächsten Vektoren zu Ihrem Anfragevektor.

Wenn Sie KNN verwenden möchten, müssen Sie Indexe mit dem Vektorindex-Typ „FLAT“ erstellen. Bei KNN sind Suchanfragen genau, aber langsamer. Wenn Sie ANN verwenden möchten, müssen Sie Indexe mit dem HNSW-Vektorindex-Typ erstellen. Mit ANN sind Suchanfragen zwar ungefähr, aber schneller. Die ANN-Genauigkeit kann durch Anpassen der HNSW-Indexparameter und des Parameters EF_RUNTIME 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 Hybrid-Abfragen.

    • Mit (*) können Sie Abfragen ausführen, für die keine Filterung erforderlich ist.
  • =>: Trennt den Filter vom Vektorsuchausdruck.

  • [KNN num_neighbours @field $vector]: Der KNN-Suchausdruck. Ersetzen Sie num_neighbors durch die gewünschte Anzahl von Ergebnissen und @field durch den Namen des 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 Vektors für den Suchparameter, wie im KNN-Suchausdruck angegeben.
    • Ersetzen Sie query_embedding durch Ihren eingebetteten Anfragevektor.
  • DIALECT 2: Gibt an, dass Sie die Abfragesprachenversion 2 oder höher verwenden (für die Vektorsuche erforderlich).

Hybridabfragen

Der ursprüngliche Ausdruck in den Klammern () ist ein Filterausdruck. Mit Filterausdrücken können Sie Vektoren während der Ausführung des Vektorsuchausdrucks filtern. Eine Abfrage, bei der ein Filterausdruck zum Filtern von Ergebnissen verwendet wird, wird als Hybridabfrage bezeichnet. Eine Hybridabfrage kann aus einer beliebigen Kombination aus Tag- und numerischen Indexen bestehen.

Memorystore for Redis Cluster verwendet zwei Ansätze zum Filtern von Vektorsuchausdrücken:

  1. 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. Sobald die gefilterten Ergebnisse berechnet wurden, wird eine Brute-Force-Suche durchgeführt, um die Ergebnisse nach Vektorähnlichkeit zu sortieren.
  2. Inline-Filterung: Bei der Inline-Filterung wird der Vektorsuchalgorithmus (z.B. HNSW) ausgeführt, wobei gefundene Vektoren, die nicht mit dem Filter übereinstimmen, ignoriert werden.

Die Vorabfilterung ist schneller, wenn der gefilterte Suchbereich viel kleiner ist als der ursprüngliche Suchbereich. Wenn der gefilterte Suchbereich groß ist, wird die Inline-Filterung schneller. Memorystore for Redis Cluster wählt automatisch zwischen den beiden Strategien aus, basierend auf dem bereitgestellten Filter.

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. Tags sind in der Regel kleine Gruppen von Werten mit einer begrenzten Anzahl möglicher Werte, z. B. 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 Wortstammerkennung durchgeführt.
  • Für ein Tag-Feld können nur Präfix- und exakte Vorfilter verwendet werden. Suffix- und Infix-Abfragen werden nicht unterstützt.
  • Standardmäßig wird bei Tags nicht zwischen Groß- und Kleinschreibung unterschieden. Beispielsweise werden sowohl „Blau“ als auch „BLAU“ als „blau“ indexiert und liefern bei einer Hybridanfrage dasselbe Ergebnis.
  • Leere Strings werden weder indexiert noch abgefragt.
  • Beim Indexieren und Abfragen werden alle nachgestellten Leerzeichen entfernt.
Syntax

{ und } sind Teil der Syntax und | wird als ODER-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}

Die folgende Abfrage gibt beispielsweise Dokumente zurück, die „hello world“ oder „hello universe“ enthalten.

@color:{hello world | hello universe}

Numerischer Index

Mit numerischen Indexen können Abfragen so gefiltert werden, dass nur Werte zwischen einem bestimmten Start- und Endwert zurückgegeben werden.

  • Sowohl inklusive als auch exklusive Abfragen werden unterstützt.
  • Bei offenen Anfragen 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 (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 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 (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 (ausschließlich) veröffentlicht wurden. Der entsprechende mathematische Ausdruck ist year >= 2015.

@year:[2015 +inf]

Die folgende Tabelle kann Ihnen als Orientierungshilfe dienen, um mathematische Ausdrücke in Vorfilterungsabfragen zu übertragen:

Mathematischer Ausdruck Filterausdruck
min <= field <= max @field:[min max]
min < Feld <= max @field:[(min max]
min <= Feld < max @field:[min (max]
min < Feld < max @field:[(min (max]
field => 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

Mit mehreren Tags und numerischen Feldern lassen sich mithilfe von logischen Operatoren komplexe Abfragen erstellen.

Logisches AND

Um ein logisches UND festzulegen, verwenden Sie ein Leerzeichen zwischen den Attributen. Beispiel:

query1 query2 query3
Logisches OR

Um ein logisches ODER festzulegen, verwenden Sie das Zeichen „|“ zwischen den Bedingungen. Beispiel:

query1 | query2 | query3
Logische Negation

Jede Anfrage kann negiert werden, indem Sie vor jede Anfrage - setzen. Bei negativen Anfragen werden alle Einträge zurückgegeben, die nicht der Anfrage entsprechen. Das gilt auch für Dokumente, die das Feld nicht enthalten.

Bei einer negativen Anfrage zu @genre:{comedy} werden beispielsweise alle Bücher zurückgegeben, die nicht dem Genre „Comedy“ angehören UND alle Bücher, die kein Genre-Feld haben.

Mit der folgenden Abfrage werden alle Bücher mit dem Genre „Comedy“ zurückgegeben, die nicht zwischen 2015 und 2024 veröffentlicht wurden oder kein Feld „year“ haben:

@genre:[comedy] -@year:[2015 2024]
Beispiele für das Kombinieren 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“ (UND) 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“ (OR) zurück, die zwischen 2015 und 2024 veröffentlicht wurden:

@genre:[comedy|horror] | @year:[2015 2024]

Mit der folgenden Abfrage werden alle Bücher zurückgegeben, die entweder kein Genre-Feld haben oder deren Genre-Feld 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.