Einschränkungen bei StructArray
Die Unterstützung von StructArray umfasst Schemadefinitionen, Einfüge-Payloads, Indizierung, Suchmodi und StructArray-spezifische Filter. Nutzen Sie diese Seite als Referenz für die Einschränkungen, bevor Sie sich in der Produktion auf das Verhalten von StructArray verlassen.
Die meisten StructArray-Einschränkungen ergeben sich aus einer der folgenden drei Quellen: dem StructArray-Schemamodell, dem von Ihnen für Vektor-Unterfelder gewählten Suchmodus und der Milvus-Version, auf der Ihre Sammlung ausgeführt wird.
Einschränkungen im Überblick
| Bereich | Beschränkung |
|---|---|
| Schemaform | Ein „Struct“ kann nur als Elementtyp eines Array-Feldes verwendet werden. „Struct“ wird nicht als Sammlungsfeld der obersten Ebene unterstützt. |
| Schema der Unterfelder | Alle Struct-Elemente im selben StructArray-Feld teilen sich ein vordefiniertes Struct-Schema. |
| Kapazität | max_capacity ist erforderlich und begrenzt die Anzahl der Struct-Elemente, die eine Entität im StructArray-Feld speichern kann. |
| Änderungen an Unterfeldern | Nachdem ein StructArray-Feld erstellt wurde, können Sie diesem bestehenden StructArray-Feld keine Unterfelder mehr hinzufügen. |
| Pfad für Unterfelder | Verwenden Sie „ structArray[subfield] “-Pfade wie beispielsweise chunks[emb] für Indizes, Suchziele, Ausgabefelder und Filter. Verwenden Sie nicht chunks.emb. |
| Form einfügen | Fügen Sie ein StructArray-Feld als Array von Objekten ein. Verwenden Sie innerhalb von Einfüge-Payloads keine Pfadsyntax. |
| Vektorindizes | Ein Vektorfeld oder Vektor-Unterfeld akzeptiert nur einen Index. Verwenden Sie separate Vektor-Unterfelder für die „EmbeddingList“-Suche und die Suche auf Elementebene. |
| Funktionen | Feldfunktionen werden für Felder oder Unterfelder innerhalb eines StructArray-Feldes nicht unterstützt. |
| Nullfähige Felder | Nullfähige StructArray-Felder sind versionsabhängig. Sofern unterstützt, gilt „null“ für das gesamte StructArray-Feld und nicht unabhängig für ein einzelnes Struct-Element. |
| Dynamisches Hinzufügen eines Feldes | Das Hinzufügen eines StructArray-Feldes zu einer bestehenden Sammlung ist versionsabhängig und setzt voraus, dass das hinzugefügte Feld nullfähig ist. |
Schema-Einschränkungen
| Beschränkung | Details |
|---|---|
| „Struct“ ist kein Feldtyp auf oberster Ebene. | Erstellen Sie ein „StructArray“-Feld als „ datatype=DataType.ARRAY “ mit „ element_type=DataType.STRUCT “ und einem „ struct_schema “. |
| Alle Elemente teilen sich ein Schema. | Jedes „Struct“-Element in einem „StructArray“-Feld folgt derselben Unterfeldliste und denselben Unterfelddatentypen. |
max_capacity ist erforderlich. | Die Anzahl der Struct-Elemente in einer Entität darf das für das StructArray-Feld konfigurierte „ max_capacity “ nicht überschreiten. |
| Vorhandene Unterfelder sind fest vorgegeben. | Sie können einem bestehenden StructArray-Feld keine neuen Unterfelder anhängen. Um das Unterfeldschema zu ändern, löschen Sie das StructArray-Feld und fügen Sie es mit dem aktualisierten Schema erneut hinzu. |
| Verschachtelte StructArray-Felder werden nicht unterstützt. | Ein „StructArray“-Feld darf keine verschachtelten „ Array “- „ ArrayOfVector “- „ Struct “- oder „ ArrayOfStruct “-Unterfelder enthalten. |
| Funktionen werden innerhalb von „StructArray“ nicht unterstützt. | Definieren Sie keine Feldfunktionen für „StructArray“-Felder oder deren Unterfelder. |
Beispiele zur Schemaerstellung finden Sie unter „Erstellen eines StructArray-Feldes“.
Unterstützte Datentypen für Unterfelder
StructArray-Unterfelder werden physisch im Array-Stil gespeichert. Die folgende Tabelle listet unterstützte und nicht unterstützte physische Typen auf.
| Physikalischer Typ des Struct-Unterfelds | Unterstützung | Hinweise |
|---|---|---|
Array | Unterstützt | Definieren Sie das Unterfeld als „ DataType.BOOL “. |
Array | Unterstützt | Definieren Sie das Unterfeld als „ DataType.INT8 “, „ DataType.INT16 “, „ DataType.INT32 “ oder „ DataType.INT64 “. |
Array | Unterstützt | Definieren Sie das Unterfeld als „ DataType.FLOAT “ oder „ DataType.DOUBLE “. |
Array | Unterstützt | Definieren Sie das Unterfeld als „ DataType.VARCHAR “ und legen Sie „ max_length “ fest. |
ArrayOfVector | Unterstützt | Definieren Sie das Unterfeld als „ DataType.FLOAT_VECTOR “ und legen Sie „ dim “ fest. |
ArrayOfVector | Unterstützt | Definieren Sie das Unterfeld als „ DataType.FLOAT16_VECTOR “ und legen Sie „ dim “ fest. |
ArrayOfVector | Unterstützt | Definieren Sie das Unterfeld als „ DataType.BFLOAT16_VECTOR “ und legen Sie „ dim “ fest. |
ArrayOfVector | Unterstützt | Definieren Sie das Unterfeld als „ DataType.INT8_VECTOR “ und legen Sie „ dim “ fest. |
ArrayOfVector | Unterstützt | Definieren Sie das Unterfeld als „ DataType.BINARY_VECTOR “ und legen Sie „ dim “ fest. |
ArrayOfVector | Nicht unterstützt | Sparse-Vektor-Teilfelder werden in StructArray-Feldern nicht unterstützt. |
Array | Nicht unterstützt | Verwenden Sie „ VARCHAR “ und nicht „ String “. |
Array | Nicht unterstützt | JSON-Unterfelder werden in StructArray-Feldern nicht unterstützt. |
Array | Nicht unterstützt | Geometrie-Unterfelder und GIS-Funktionen werden in StructArray-Feldern nicht unterstützt. |
Array | Nicht unterstützt | Text-Unterfelder werden in StructArray-Feldern nicht unterstützt. |
Array | Nicht unterstützt | Timestamptz-Unterfelder und zeitbezogene Ausdrücke werden in StructArray-Feldern nicht unterstützt. |
Verschachtelte „ Array “, „ ArrayOfVector “, „ Struct “ oder ArrayOfStruct | Nicht unterstützt | StructArray-Felder unterstützen keine verschachtelten Array-, Vektor-Array-, Struct- oder Array-of-Struct-Unterfelder. |
Einschränkungen bei nullfähigen und dynamischen Schemata
Das Verhalten von nullfähigen StructArrays und das dynamische Hinzufügen von StructArray-Feldern sind versionsabhängig.
| Funktionalität | Einschränkung |
|---|---|
| Nullfähiges StructArray-Feld | Wird nur in Versionen unterstützt, die nullfähige StructArrays und nullfähige Vektor-Arrays unterstützen. |
| Null-Wert in Python | Verwenden Sie „ None “, um einen Null-Wert in ein StructArray in Python einzufügen. Verwenden Sie nicht „ Null “ oder „ null “. |
| Gültigkeitsbereich von „null“ | „Null“ gilt für das gesamte StructArray-Feld. Beispielsweise ist „ chunks=None “ nur dann gültig, wenn „ chunks “ nullfähig ist. |
| Teilweise null-fähige StructArray-Werte | Wenn ein StructArray-Feld einen gültigen Array-Wert enthält, dürfen Sie in demselben Wert keine null-Subfeld-Arrays mit gültigen Subfeld-Arrays mischen. |
| Dynamisches Hinzufügen eines StructArray-Feldes | Das Hinzufügen eines StructArray-Feldes zu einer bestehenden Sammlung wird nur in Versionen unterstützt, die die dynamische Unterstützung von StructArray-Feldern enthalten. |
| Null-Anforderung für dynamisches Hinzufügen | Ein StructArray-Feld, das einer bestehenden Sammlung hinzugefügt wird, muss nullfähig sein, da bestehende Entitäten noch keinen Wert für das neue Feld haben. |
| Vorhandene Entitäten nach dem dynamischen Hinzufügen | Bestehende Entitäten geben für das hinzugefügte StructArray-Feld in allen seinen Unterfeldern den Wert „ null “ zurück. |
In Milvus v3.0.x sind nullfähige „StructArray“-Felder, nullfähige Vektor-Arrays und das dynamische Hinzufügen von „StructArray“-Feldern verfügbar.
Beispiele für das Einfügen mit nullfähigen StructArray-Feldern finden Sie unter „Daten in StructArray-Felder einfügen“.
Einschränkungen beim Einfügen
| Begrenzung | Details |
|---|---|
| Form der Nutzdaten | Fügen Sie das StructArray-Feld als Array von Struct-Objekten ein, z. B. chunks: [{"text": "...", "emb": [...]}]. |
| Namen der Unterfelder | Verwenden Sie innerhalb jedes Struct-Objekts Unterfeldnamen wie „ text “ und „ emb “, nicht Pfade wie „ chunks[text] “. |
| Schema-Übereinstimmung | Jedes Struct-Element muss dem Struct-Schema entsprechen. |
| Kapazität | Die Anzahl der Struct-Elemente in einer Entität darf max_capacity nicht überschreiten. |
| Vektordimensionen | Vektorwerte müssen mit den für ihre Vektor-Unterfelder konfigurierten „ dim “ übereinstimmen. |
| Duplizierung im Suchmodus | Wenn Sie sowohl die „EmbeddingList“-Suche als auch die Suche auf Elementebene benötigen, schreiben Sie Vektoren in zwei separate Vektor-Unterfelder. |
Index- und Metrikbeschränkungen
Ein StructArray-Vektor-Unterfeld kann entweder für die „EmbeddingList“-Suche oder für die Suche auf Elementebene indiziert werden. Dasselbe Vektor-Unterfeld kann nicht beide Metrikfamilien verwenden, da jedes Vektorfeld oder Vektor-Unterfeld nur einen Index akzeptiert.
| Suchmodus | Metrikfamilie | Ergebnisebene |
|---|---|---|
| „EmbeddingList“-Suche | MAX_SIM, „ MAX_SIM_COSINE “, „ MAX_SIM_IP “, „ MAX_SIM_L2 “ oder „binary MAX_SIM_* “-Metriken | Ergebnisse auf Entitätsebene. |
| Suche auf Elementebene | Reguläre Vektormetriken wie L2, IP, COSINE, HAMMING oder JACCARD | Ergebnisse auf Elementebene, die den Offset des gefundenen Elements enthalten können. |
Verwenden Sie separate Vektor-Unterfelder, wenn beide Modi erforderlich sind. Verwenden Sie beispielsweise „ chunks[emb_list_vector] “ für die „EmbeddingList“-Suche und „ chunks[emb] “ für die Suche auf Elementebene.
StructArray-Vektor-Unterfelder zählen bei der Planung Ihres Sammlungsschemas als Vektor-Unterfelder. Halten Sie die Gesamtzahl der Vektorfelder und Vektor-Unterfelder innerhalb der Grenzen Ihrer Zielversion und Ihrer Service-Stufe.
Informationen zur unterstützten Matrix aus Index- und Metriktypen finden Sie unter „Index-StructArray-Felder“.
Suchbeschränkungen
| Suchverhalten | Unterstützung und Einschränkungen |
|---|---|
| Grundlegende „EmbeddingList“-Suche | Unterstützt für StructArray-Vektor-Unterfelder, die mit „ MAX_SIM* “-Metriken indiziert sind. Liefert Ergebnisse auf Entitätsebene. |
| Einfache Suche auf Elementebene | Wird für StructArray-Vektor-Teilfelder unterstützt, die mit regulären Vektormetriken indiziert sind. Kann Offsets der übereinstimmenden Elemente zurückgeben. |
| Bereichssuche | Wird je nach Suchmodus und der Unterstützung von Indizes/Metriken durch die Zielversion unterstützt. Für das Verhalten bei der hybriden Bereichssuche bei StructArray-Anfragen auf Elementebene überprüfen Sie bitte Ihre Zielversion. |
| Gruppierte Suche | Die gruppierte Suche auf Elementebene kann Offsets zurückgeben. Das Verhalten der hybriden Gruppensuche bei StructArray-Anfragen auf Elementebene ist versionsabhängig. |
| Hybride Suche | Eine hybride Suchanfrage kann nur dann StructArray-Vektor-Unterfeldanfragen enthalten, wenn die Zielversion diese Suchkombination unterstützt. Jede Anfrage folgt weiterhin der Metrikfamilie des indizierten Vektor-Unterfelds. |
| Offset-Ausgabe | Offsets sind für Suchergebnisse auf Elementebene verfügbar. Die EmbeddingList-Suche liefert Ergebnisse auf Entitätsebene und verwendet keine Element-Offsets als primäre Ergebniseinheit. |
Filter- und Operatorbeschränkungen
Die skalare Filterung von StructArray wird durch StructArray-Operatoren wie „ element_filter “ und die „ MATCH_* “-Familie abgewickelt. Die detaillierte Matrix zur Prädikatsunterstützung ist unter „StructArray-Operatoren“ zu finden.
Auf hoher Ebene gilt:
Verwenden Sie „
$[subfield]“ ausschließlich innerhalb von StructArray-Operatoren.Verwenden Sie skalare Unterfelder für skalare Prädikate.
Verwenden Sie keine Vektor-Teilfelder als Eingaben für skalare Prädikate von „
$[...]“.JSON-Path-Syntax, JSON-Funktionen, Array-Container-Funktionen, Textabgleichsfunktionen, Geometrie-/GIS-Funktionen und Timestamptz-Ausdrücke werden für Prädikate auf StructArray-Ebene nicht unterstützt.
Verwenden Sie vorzugsweise explizite boolesche Vergleiche wie „
$[has_code] == true“ anstelle von einfachen booleschen Ausdrücken.
Verwandte Seiten
Informationen zum Erstellen eines StructArray-Feldes finden Sie unter „StructArray-Feld erstellen“.
Informationen zum Einfügen von Daten finden Sie unter „Daten in StructArray-Felder einfügen“.
Informationen zum Erstellen von Vektor- und Skalarindizes finden Sie unter „StructArray-Felder indizieren“.
Informationen zur StructArray-Filtersyntax finden Sie unter „StructArray-Operatoren“.