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

BereichBeschränkung
SchemaformEin „Struct“ kann nur als Elementtyp eines Array-Feldes verwendet werden. „Struct“ wird nicht als Sammlungsfeld der obersten Ebene unterstützt.
Schema der UnterfelderAlle Struct-Elemente im selben StructArray-Feld teilen sich ein vordefiniertes Struct-Schema.
Kapazitätmax_capacity ist erforderlich und begrenzt die Anzahl der Struct-Elemente, die eine Entität im StructArray-Feld speichern kann.
Änderungen an UnterfeldernNachdem ein StructArray-Feld erstellt wurde, können Sie diesem bestehenden StructArray-Feld keine Unterfelder mehr hinzufügen.
Pfad für UnterfelderVerwenden Sie „ structArray[subfield] “-Pfade wie beispielsweise chunks[emb] für Indizes, Suchziele, Ausgabefelder und Filter. Verwenden Sie nicht chunks.emb.
Form einfügenFügen Sie ein StructArray-Feld als Array von Objekten ein. Verwenden Sie innerhalb von Einfüge-Payloads keine Pfadsyntax.
VektorindizesEin Vektorfeld oder Vektor-Unterfeld akzeptiert nur einen Index. Verwenden Sie separate Vektor-Unterfelder für die „EmbeddingList“-Suche und die Suche auf Elementebene.
FunktionenFeldfunktionen werden für Felder oder Unterfelder innerhalb eines StructArray-Feldes nicht unterstützt.
Nullfähige FelderNullfä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 FeldesDas 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änkungDetails
„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-UnterfeldsUnterstützungHinweise
ArrayUnterstütztDefinieren Sie das Unterfeld als „ DataType.BOOL “.
ArrayUnterstütztDefinieren Sie das Unterfeld als „ DataType.INT8 “, „ DataType.INT16 “, „ DataType.INT32 “ oder „ DataType.INT64 “.
ArrayUnterstütztDefinieren Sie das Unterfeld als „ DataType.FLOAT “ oder „ DataType.DOUBLE “.
ArrayUnterstütztDefinieren Sie das Unterfeld als „ DataType.VARCHAR “ und legen Sie „ max_length “ fest.
ArrayOfVectorUnterstütztDefinieren Sie das Unterfeld als „ DataType.FLOAT_VECTOR “ und legen Sie „ dim “ fest.
ArrayOfVectorUnterstütztDefinieren Sie das Unterfeld als „ DataType.FLOAT16_VECTOR “ und legen Sie „ dim “ fest.
ArrayOfVectorUnterstütztDefinieren Sie das Unterfeld als „ DataType.BFLOAT16_VECTOR “ und legen Sie „ dim “ fest.
ArrayOfVectorUnterstütztDefinieren Sie das Unterfeld als „ DataType.INT8_VECTOR “ und legen Sie „ dim “ fest.
ArrayOfVectorUnterstütztDefinieren Sie das Unterfeld als „ DataType.BINARY_VECTOR “ und legen Sie „ dim “ fest.
ArrayOfVectorNicht unterstütztSparse-Vektor-Teilfelder werden in StructArray-Feldern nicht unterstützt.
ArrayNicht unterstütztVerwenden Sie „ VARCHAR “ und nicht „ String “.
ArrayNicht unterstütztJSON-Unterfelder werden in StructArray-Feldern nicht unterstützt.
ArrayNicht unterstütztGeometrie-Unterfelder und GIS-Funktionen werden in StructArray-Feldern nicht unterstützt.
ArrayNicht unterstütztText-Unterfelder werden in StructArray-Feldern nicht unterstützt.
ArrayNicht unterstütztTimestamptz-Unterfelder und zeitbezogene Ausdrücke werden in StructArray-Feldern nicht unterstützt.
Verschachtelte „ Array “, „ ArrayOfVector “, „ Struct “ oder ArrayOfStructNicht unterstütztStructArray-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ätEinschränkung
Nullfähiges StructArray-FeldWird nur in Versionen unterstützt, die nullfähige StructArrays und nullfähige Vektor-Arrays unterstützen.
Null-Wert in PythonVerwenden 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-WerteWenn 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-FeldesDas 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ügenEin 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ügenBestehende 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

BegrenzungDetails
Form der NutzdatenFügen Sie das StructArray-Feld als Array von Struct-Objekten ein, z. B. chunks: [{"text": "...", "emb": [...]}].
Namen der UnterfelderVerwenden Sie innerhalb jedes Struct-Objekts Unterfeldnamen wie „ text “ und „ emb “, nicht Pfade wie „ chunks[text] “.
Schema-ÜbereinstimmungJedes Struct-Element muss dem Struct-Schema entsprechen.
KapazitätDie Anzahl der Struct-Elemente in einer Entität darf max_capacity nicht überschreiten.
VektordimensionenVektorwerte müssen mit den für ihre Vektor-Unterfelder konfigurierten „ dim “ übereinstimmen.
Duplizierung im SuchmodusWenn 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.

SuchmodusMetrikfamilieErgebnisebene
„EmbeddingList“-SucheMAX_SIM, „ MAX_SIM_COSINE “, „ MAX_SIM_IP “, „ MAX_SIM_L2 “ oder „binary MAX_SIM_* “-MetrikenErgebnisse auf Entitätsebene.
Suche auf ElementebeneReguläre Vektormetriken wie L2, IP, COSINE, HAMMING oder JACCARDErgebnisse 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

SuchverhaltenUnterstützung und Einschränkungen
Grundlegende „EmbeddingList“-SucheUnterstützt für StructArray-Vektor-Unterfelder, die mit „ MAX_SIM* “-Metriken indiziert sind. Liefert Ergebnisse auf Entitätsebene.
Einfache Suche auf ElementebeneWird für StructArray-Vektor-Teilfelder unterstützt, die mit regulären Vektormetriken indiziert sind. Kann Offsets der übereinstimmenden Elemente zurückgeben.
BereichssucheWird 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 SucheDie gruppierte Suche auf Elementebene kann Offsets zurückgeben. Das Verhalten der hybriden Gruppensuche bei StructArray-Anfragen auf Elementebene ist versionsabhängig.
Hybride SucheEine 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-AusgabeOffsets 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.

  1. Informationen zum Erstellen eines StructArray-Feldes finden Sie unter „StructArray-Feld erstellen“.

  2. Informationen zum Einfügen von Daten finden Sie unter „Daten in StructArray-Felder einfügen“.

  3. Informationen zum Erstellen von Vektor- und Skalarindizes finden Sie unter „StructArray-Felder indizieren“.

  4. Informationen zur StructArray-Filtersyntax finden Sie unter „StructArray-Operatoren“.