In der Vektorsuche können Sie mithilfe von booleschen Regeln die Suche nach Vektorähnlichkeiten auf eine Teilmenge des Index beschränken. Boolesche Prädikate teilen der Vektorsuche mit, welche Vektoren im Index ignoriert werden sollen. Auf dieser Seite erfahren Sie mehr über die Funktionsweise des Filterns und können sich Beispiele und Möglichkeiten zur effizienten Abfrage von Daten basierend auf Vektorähnlichkeiten ansehen.
Mit der Vektorsuche können Sie Ergebnisse nach kategorialen und numerischen Einschränkungen einschränken. Das Hinzufügen von Einschränkungen oder das „Filtern“ Ihrer Indexergebnisse ist aus verschiedenen Gründen hilfreich, wie in den folgenden Beispielen:
Verbesserte Ergebnisrelevanz: Die Vektorsuche ist ein leistungsstarkes Tool zum Auffinden semantisch ähnlicher Elemente. Mithilfe von Filtern können irrelevante Ergebnisse aus den Suchergebnissen entfernt werden, z. B. Elemente, die nicht in der richtigen Sprache, Kategorie, Preis oder demselben Zeitraum liegen.
Geringere Anzahl an Ergebnissen: Die Vektorsuche kann eine große Anzahl von Ergebnissen zurückgeben, insbesondere bei großen Datasets. Mit Filtern können Sie die Anzahl der Ergebnisse auf eine überschaubare Zahl reduzieren, während Sie weiterhin die relevantesten Ergebnisse zurückgeben.
Segmentierte Ergebnisse: Mithilfe von Filtern können die Suchergebnisse an die individuellen Anforderungen und Einstellungen des Nutzers angepasst werden. Beispielsweise kann ein Nutzer die Ergebnisse so filtern, dass nur Elemente angezeigt werden, die in der Vergangenheit hoch bewertet wurden oder in eine bestimmte Preisspanne fallen.
Vektorattribute
In einer Vektorähnlichkeitssuche über eine Datenbank von Vektoren wird jeder Vektor durch null oder mehr Attribute beschrieben. Diese Attribute werden als Tokens für Tokeneinschränkungen und Werte für numerische Einschränkungen bezeichnet. Diese Einschränkungen können für jede der mehreren Attributkategorien gelten, auch als Namespaces bezeichnet.
In der folgenden Beispielanwendung sind Vektoren mit color
, price
und shape
getaggt:
color
,price
, undshape
sind Namespaces.red
undblue
sind Tokens aus demcolor
-Namespace.square
undcircle
sind Tokens aus demshape
-Namespace.100
und50
sind Werte aus dem Namespaceprice
.
Vektorattribute angeben
- So geben Sie einen „roten Kreis “ an:
{color: red}, {shape: circle}
. - So geben Sie ein „ rotes und blaues Quadrat“ an:
{color: red, blue}, {shape: square}
. - Wenn Sie ein Objekt ohne Farbe angeben möchten, lassen Sie den Namespace „Farbe“ im Feld
restricts
weg. - Notieren Sie sich den Namespace und den Wert im entsprechenden Feld für den Typ, um numerische Einschränkungen für ein Objekt anzugeben. Der Ganzzahlwert muss in
value_int
, der Gleitkommawert invalue_float
und der doppelte Wert invalue_double
angegeben werden. Für einen bestimmten Namespace sollte nur ein Zahlentyp verwendet werden.
Informationen zu dem Schema, das zum Angeben dieser Daten verwendet wird, finden Sie unter Namespaces und Tokens in den Eingabedaten angeben.
Abfragen
- Abfragen drücken einen logischen UND-Operator über Namespaces hinweg und einen logischen OR-Operator innerhalb jedes Namespace aus. Eine Abfrage, die
{color: red, blue}, {shape: square, circle}
angibt, stimmt mit allen Datenbankpunkten überein, die(red || blue) && (square || circle)
erfüllen. - Eine Abfrage, die
{color: red}
angibt, Übereinstimmungen werden mit allenred
-Objekten ohne Einschränkung beishape
abgeglichen. - Numerische Einschränkungen in Abfragen erfordern
namespace
, einen der Zahlenwerte ausvalue_int
,value_float
undvalue_double
sowie den Operatorop
. - Operator
op
ist einer der folgenden Werte:LESS
,LESS_EQUAL
,EQUAL
,GREATER_EQUAL
undGREATER
. Wenn beispielsweise der OperatorLESS_EQUAL
verwendet wird, sind Datenpunkte zulässig, wenn ihr Wert kleiner oder gleich dem in der Abfrage verwendeten Wert ist.
Die folgenden Codebeispiele identifizieren Vektorattribute in der Beispielanwendung:
{
namespace: "price"
value_int: 20
op: LESS
}
{
namespace: "length"
value_float: 0.3
op: GREATER_EQUAL
}
{
namespace: "width"
value_double: 0.5
op: EQUAL
}
Sperrliste
Für komplexere Szenarien unterstützt Google eine Form der Negation, die als Sperrlisten-Tokens bezeichnet wird. Wenn eine Abfrage ein Token in die Sperrliste aufnimmt, werden Übereinstimmungen für jeden Datenpunkt ausgeschlossen, der das Sperrlisten-Token enthält. Wenn ein Abfrage-Namespace nur Sperrlisten-Tokens enthält, stimmen alle Punkte, die nicht explizit auf die Sperrliste gesetzt wurden, genau auf dieselbe Weise überein wie ein leerer Namespace mit allen Punkten übereinstimmt.
Datenpunkte können auch ein Token auf die Sperrliste setzen und Übereinstimmungen mit jeder Abfrage, die dieses Token enthält, ausschließen.
Definieren Sie beispielsweise die folgenden Datenpunkte mit den angegebenen Tokens:
A: {} // empty set matches everything B: {red} // only a 'red' token C: {blue} // only a 'blue' token D: {orange} // only an 'orange' token E: {red, blue} // multiple tokens F: {red, !blue} // deny the 'blue' token G: {red, blue, !blue} // An unlikely edge-case H: {!blue} // deny-only (similar to empty-set)
Das System verhält sich so:
- Leere Abfrage-Namespaces sind universell übereinstimmende Platzhalter. Beispielsweise stimmt Q:
{}
mit DB:{color:red}
überein. Leere Datenpunkt-Namespaces sind keine universell übereinstimmende Platzhalter. Q:
{color:red}
stimmt beispielsweise nicht mit DB:{}
überein.
Namespaces und Tokens oder Werte in den Eingabedaten angeben
Informationen zur Strukturierung Ihrer Eingabedaten finden Sie unter Format und Struktur der Eingabedaten.
Auf den folgenden Tabs wird gezeigt, wie Sie die Namespaces und Tokens angeben, die mit jedem Eingabevektor verknüpft sind.
JSON
Fügen Sie für den Datensatz jedes Vektors ein Feld namens
restricts
hinzu, das ein Array von Objekten enthält, die jeweils ein Namespace sind.- Jedes Objekt muss ein Feld mit dem Namen
namespace
haben. Dieses Feld ist der NamespaceTokenNamespace.namespace
. - Der Wert des Felds
allow
, falls vorhanden, ist ein Array von Strings. Dieses Array von Strings ist dieTokenNamespace.string_tokens
-Liste. - Der Wert des Felds
deny
, falls vorhanden, ist ein Array von Strings. Dieses Array von Strings ist dieTokenNamespace.string_denylist_tokens
-Liste.
- Jedes Objekt muss ein Feld mit dem Namen
Im Folgenden finden Sie zwei Beispieleinträge im JSON-Format:
{"id": "42", "embedding": [0.5, 1.0], "restricts": [{"namespace": "class",
"allow": ["cat", "pet"]},{"namespace": "category", "allow": ["feline"]}]}
{"id": "43", "embedding": [0.6, 1.0], "restricts": [{"namespace":
"class", "allow": ["dog", "pet"]},{"namespace": "category", "allow":
["canine"]}]}
Fügen Sie für den Datensatz jedes Vektors ein Feld namens
numeric_restricts
hinzu, das ein Array von Objekten enthält, die jeweils eine numerische Beschränkung sind.- Jedes Objekt muss ein Feld mit dem Namen
namespace
haben. Dieses Feld ist der NamespaceNumericRestrictNamespace.namespace
. - Jedes Objekt muss einen der folgenden Werte haben:
value_int
,value_float
odervalue_double
. - Jedes Objekt darf kein Feld mit dem Namen
op
haben. Dieses Feld dient nur der Abfrage.
- Jedes Objekt muss ein Feld mit dem Namen
Im Folgenden finden Sie zwei Beispieleinträge im JSON-Format:
{"id": "42", "embedding": [0.5, 1.0], "numeric_restricts":
[{"namespace": "size", "value_int": 3},{"namespace": "ratio", "value_float": 0.1}]}
{"id": "43", "embedding": [0.6, 1.0], "numeric_restricts": [{"namespace":
"weight", "value_double": 0.3}]}
Avro
Avro-Datensätze verwenden das folgende Schema:
{
"type": "record",
"name": "FeatureVector",
"fields": [
{
"name": "id",
"type": "string"
},
{
"name": "embedding",
"type": {
"type": "array",
"items": "float"
}
},
{
"name": "restricts",
"type": [
"null",
{
"type": "array",
"items": {
"type": "record",
"name": "Restrict",
"fields": [
{
"name": "namespace",
"type": "string"
},
{
"name": "allow",
"type": [
"null",
{
"type": "array",
"items": "string"
}
]
},
{
"name": "deny",
"type": [
"null",
{
"type": "array",
"items": "string"
}
]
}
]
}
}
]
},
{
"name": "numeric_restricts",
"type": [
"null",
{
"type": "array",
"items": {
"name": "NumericRestrict",
"type": "record",
"fields": [
{
"name": "namespace",
"type": "string"
},
{
"name": "value_int",
"type": [ "null", "int" ],
"default": null
},
{
"name": "value_float",
"type": [ "null", "float" ],
"default": null
},
{
"name": "value_double",
"type": [ "null", "double" ],
"default": null
}
]
}
}
],
"default": null
},
{
"name": "crowding_tag",
"type": [
"null",
"string"
]
}
]
}
CSV
Tokeneinschränkungen
Fügen Sie für den Eintrag jedes Vektors kommagetrennte Paare des Formats
name=value
hinzu, um Token-Namespace-Einschränkungen anzugeben. Derselbe Name kann wiederholt werden, wenn ein Namespace mehrere Werte enthält.Beispielsweise steht
color=red,color=blue
für diesenTokenNamespace
:{ "namespace": "color" "string_tokens": ["red", "blue"] }
Fügen Sie für den Eintrag jedes Vektors kommagetrennte Paare des Formats
name=!value
hinzu, um den Ausschlusswert für Token-Namespace-Einschränkungen anzugeben.Beispielsweise steht
color=!red
für diesenTokenNamespace
:{ "namespace": "color" "string_blacklist_tokens": ["red"] }
Numerische Einschränkungen
Fügen Sie für den Datensatz jedes Vektors kommagetrennte Paare des Formats
#name=numericValue
mit dem Zahlentypsuffix hinzu, um numerische Namespace-Einschränkungen anzugeben.Das Zahlentypsuffix ist
i
für Ganzzahl,f
für Gleitkommazahl undd
für Double. Derselbe Name sollte nicht wiederholt werden, da jedem Namespace ein einzelner Wert zugeordnet sein sollte.Beispielsweise steht
#size=3i
für diesenNumericRestrictNamespace
:{ "namespace": "size" "value_int": 3 }
#ratio=0.1f
steht für dieseNumericRestrictNamespace
:{ "namespace": "ratio" "value_float": 0.1 }
#weight=0.3d
steht für dieseNumericRestriction
:{ "namespace": "weight" "value_double": 0.3 }
Nächste Schritte
- Informationen zum Abfragen der Indexe, um die nächsten Nachbarn zu finden
- Informationen zum Auswählen, Abfragen und Anzeigen dieser Messwerte in Metrics Explorer