Ограничения StructArray

Поддержка StructArray охватывает определение схемы, вставку данных, индексирование, режимы поиска и фильтры, специфичные для StructArray. Используйте эту страницу в качестве справочника по ограничениям, прежде чем полагаться на поведение StructArray в производственной среде.

Большинство ограничений StructArray обусловлено одним из трёх факторов: моделью схемы StructArray, выбранным режимом поиска для подполей вектора и версией Milvus, на которой работает ваша коллекция.

Краткий обзор ограничений

ОбластьОграничение
Форма схемыStruct можно использовать только в качестве типа элемента поля Array. Struct не поддерживается в качестве поля коллекции верхнего уровня.
Схема подполяВсе элементы Struct в одном поле StructArray используют одну предопределенную схему Struct.
Емкостьmax_capacity является обязательным параметром и ограничивает количество элементов Struct, которые одна сущность может хранить в поле StructArray.
Изменения подполейПосле создания поля StructArray добавить подполя в это существующее поле StructArray невозможно.
Путь к подполюИспользуйте пути в формате structArray[subfield], например chunks[emb], для индексов, целей поиска, полей вывода и фильтров. Не используйте chunks.emb.
Вставка формыВставьте поле StructArray в виде массива объектов. Не используйте синтаксис путей внутри данных вставки.
Векторные индексыВекторное поле или векторное подполе принимает только один индекс. Используйте отдельные векторные подполя для поиска по EmbeddingList и поиска на уровне элементов.
ФункцииФункции полей не поддерживаются для полей или подполей внутри поля StructArray.
Поля, допускающие значение nullПоля StructArray, допускающие значение null, зависят от версии. Если они поддерживаются, значение null применяется ко всему полю StructArray, а не к отдельному элементу Struct независимо.
Динамическое добавление поляДобавление поля StructArray в существующую коллекцию зависит от версии и требует, чтобы добавляемое поле допускало значение null.

Ограничения схемы

ОграничениеПодробности
Struct не является типом поля верхнего уровня.Создайте поле StructArray как « datatype=DataType.ARRAY » с « element_type=DataType.STRUCT » и « struct_schema ».
Все элементы используют одну схему.Каждый элемент Struct в поле StructArray соответствует тому же списку подполей и тем же типам данных подполей.
max_capacity обязателен.Количество элементов Struct в одной сущности не должно превышать значение max_capacity, настроенное для поля StructArray.
Существующие подполя являются фиксированными.К существующему полю StructArray нельзя добавлять новые подполя. Чтобы изменить схему подполей, удалите поле StructArray и добавьте его заново с обновленной схемой.
Вложенные StructArray не поддерживаются.Поле StructArray не может содержать вложенные подполя типа Array, ArrayOfVector, Struct или ArrayOfStruct.
Функции внутри StructArray не поддерживаются.Не определяйте функции полей для полей StructArray или их подполей.

Примеры создания схем см. в разделе «Создание поля StructArray».

Поддерживаемые типы данных подполей

Поподполя StructArray сопоставляются физическому хранению в виде массива. В следующей таблице приведены поддерживаемые и неподдерживаемые физические типы.

Физический тип подполя StructПоддержкаПримечания
ArrayПоддерживаетсяОпределите подполе как DataType.BOOL.
ArrayПоддерживаетсяОпределите подполе как DataType.INT8, DataType.INT16, DataType.INT32 или DataType.INT64.
ArrayПоддерживаетсяОпределите подполе как DataType.FLOAT или DataType.DOUBLE.
ArrayПоддерживаетсяОпределите подполе как DataType.VARCHAR и установите max_length.
ArrayOfVectorПоддерживаетсяОпределите подполе как DataType.FLOAT_VECTOR и установите dim.
ArrayOfVectorПоддерживаетсяОпределите подполе как DataType.FLOAT16_VECTOR и установите dim.
ArrayOfVectorПоддерживаетсяОпределите подполе как « DataType.BFLOAT16_VECTOR » и установите значение dim.
ArrayOfVectorПоддерживаетсяОпределите подполе как « DataType.INT8_VECTOR » и установите значение dim.
ArrayOfVectorПоддерживаетсяОпределите подполе как « DataType.BINARY_VECTOR » и установите значение « dim ».
ArrayOfVectorНе поддерживаетсяПодполя с разреженными векторами не поддерживаются в полях StructArray.
ArrayНе поддерживаетсяИспользуйте VARCHAR, а не String.
ArrayНе поддерживаетсяПоподполя JSON не поддерживаются в полях StructArray.
ArrayНе поддерживаетсяПо podpolu «Геометрия» и функции ГИС не поддерживаются в полях StructArray.
ArrayНе поддерживаетсяПо podpólia «Текст» в полях StructArray не поддерживаются.
ArrayНе поддерживаетсяВ полях StructArray не поддерживаются подполя Timestamptz и выражения, зависящие от времени.
Вложенные « Array », « ArrayOfVector », « Struct » или ArrayOfStructНе поддерживаетсяПоля StructArray не поддерживают вложенные подполя типа массив, вектор-массив, Struct или массив структур.

Ограничения, связанные с допускаемыми нулевыми значениями и динамическими схемами

Поведение StructArray с допустимыми нулевыми значениями и динамическое добавление полей StructArray зависят от версии.

ВозможностиОграничение
Поле StructArray с возможностью присвоения нулевого значенияПоддерживается в Milvus 3.0.0 и более поздних версиях. Установите флаг « nullable=True » для родительского объекта StructArray; не настраивайте подполя Struct как допускающие нулевые значения отдельно.
Нулевое значение в PythonИспользуйте ` None ` для вставки нулевого значения StructArray в Python. Не используйте ` Null ` или ` null`.
Область действия нулевого значенияNull применяется ко всему полю StructArray. Например, chunks=None допустим только в том случае, если chunks допускает значение null.
Частично нулевое значение StructArrayЕсли поле StructArray содержит допустимое значение массива, не смешивайте массивы подполей с нулевым значением с массивами подполей с допустимыми значениями в одном и том же значении.
Динамическое добавление поля StructArrayПоддерживается в Milvus 3.0.0 и более поздних версиях.
Требование допускания null при динамическом добавленииПоле StructArray, добавляемое в существующую коллекцию, должно допускать значение null, так как существующие сущности не имеют значения для нового поля.
Сущности после динамического добавленияСуществующие сущности возвращают значение « null » для добавленного поля StructArray.

В версиях Milvus 3.0.0 и более поздних поддерживаются поля StructArray, допускающие значение null, векторные массивы, допускающие значение null, а также динамическое добавление полей StructArray как в автономных, так и в распределенных развертываниях. Более ранние версии Milvus не поддерживают эти возможности.

В Zilliz Cloud эти возможности доступны в кластерах On-Demand, работающих под управлением Milvus 3.0.0 или более поздних версий. Кластеры Serving их не поддерживают.

Примеры вставки данных с полями StructArray, допускающими значение null, см. в разделе «Вставка данных в поля StructArray».

Ограничения на вставку

ОграничениеПодробности
Формат данныхВставьте поле StructArray в виде массива объектов Struct, например chunks: [{"text": "...", "emb": [...]}].
Имена подполейВнутри каждого объекта Struct используйте имена подполей, такие как text и emb, а не пути, такие как chunks[text].
Соответствие схемеКаждый элемент Struct должен соответствовать схеме Struct.
ЕмкостьКоличество элементов Struct в одной сущности не должно превышать max_capacity.
Размеры вектораЗначения вектора должны соответствовать параметру « dim », настроенному для их векторных подполей.
Дублирование в режиме поискаЕсли вам требуется как поиск по EmbeddingList, так и поиск на уровне элементов, записывайте векторы в два отдельных векторных подполя.

Ограничения на индекс и метрику

Векторное подполе StructArray может быть индексировано либо для поиска по EmbeddingList, либо для поиска на уровне элементов. Одно и то же векторное подполе не может использовать обе семьи метрик, поскольку каждое векторное поле или векторное подполе принимает только один индекс.

Режим поискаСемейство метрикУровень результатов
Поиск по EmbeddingListMAX_SIM, метрики « MAX_SIM_COSINE » , « MAX_SIM_IP » , « MAX_SIM_L2 » или бинарные метрики « MAX_SIM_* »Результаты на уровне сущностей.
Поиск на уровне элементовОбычные векторные метрики, такие как L2, IP, COSINE, HAMMING или JACCARDРезультаты на уровне элементов, которые могут включать смещение найденного элемента.

Если требуются оба режима, используйте отдельные векторные подполя. Например, используйте chunks[emb_list_vector] для поиска по EmbeddingList и chunks[emb] для поиска на уровне элементов.

Подполя вектора StructArray учитываются как подполя вектора при планировании схемы коллекции. Общее количество векторных полей и подполей вектора должно укладываться в пределы, установленные для целевой версии и уровня обслуживания.

Поддерживаемые матрицы типа индекса и метрики см. в разделе «Поля StructArray индекса».

Ограничения поиска

Поведение поискаПоддержка и ограничения
Базовый поиск по EmbeddingListПоддерживается для векторных подполей StructArray, индексированных с помощью метрик типа « MAX_SIM* ». Возвращает результаты на уровне сущностей.
Базовый поиск на уровне элементовПоддерживается для подполей вектора StructArray, индексированных с помощью обычных векторных метрик. Может возвращать смещения совпадающих элементов.
Поиск по диапазонуПоддерживается в зависимости от режима поиска и поддержки индексов/метрик целевой версии. Чтобы узнать о поведении гибридного поиска по диапазону при запросах StructArray на уровне элементов, проверьте вашу целевую версию.
Поиск с группировкойПоиск с группировкой на уровне элементов может возвращать смещения. Поведение гибридного поиска с группировкой для запросов StructArray на уровне элементов зависит от версии.
Гибридный поискЗапрос гибридного поиска может включать запросы на подполя вектора StructArray только в том случае, если целевая версия поддерживает данную комбинацию поиска. Каждый запрос по-прежнему следует семейству метрик индексированного подполя вектора.
Вывод смещенийСмещение доступно для результатов поиска на уровне элементов. Поиск по EmbeddingList возвращает результаты на уровне сущностей и не использует смещения элементов в качестве основной единицы результата.

Ограничения фильтров и операторов

Скалярная фильтрация StructArray осуществляется с помощью операторов StructArray, таких как « element_filter » и семейства операторов « MATCH_* ». Подробная матрица поддержки предикатов приведена в разделе «Операторы StructArray».

В общих чертах:

  • Используйте « $[subfield] » только внутри операторов StructArray.

  • Используйте скалярные подполя для скалярных предикатов.

  • Не используйте векторные подполя в качестве входных данных для скалярных предикатов типа « $[...] ».

  • Синтаксис JSON-путей, функции JSON, функции контейнеров массивов, функции сопоставления текста, функции геометрии/ГИС и выражения Timestamptz не поддерживаются для предикатов на уровне элементов StructArray.

  • Предпочтительно используйте явные булевы сравнения, такие как ` $[has_code] == true `, вместо простых булевых выражений.

  1. Чтобы создать поле StructArray, ознакомьтесь со статьёй «Создание поля StructArray».

  2. Для вставки данных ознакомьтесь с разделом «Вставка данных в поля StructArray».

  3. Чтобы создать векторные и скалярные индексы, ознакомьтесь с разделом «Индексирование полей StructArray».

  4. Чтобы ознакомиться с синтаксисом фильтров StructArray, прочтите раздел «Операторы StructArray».