Ограничения 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Не поддерживаетсяПо podpola JSON не поддерживаются в полях StructArray.
ArrayНе поддерживаетсяПо podpolu «Геометрия» и функции ГИС не поддерживаются в полях StructArray.
ArrayНе поддерживаетсяПо podpolu «Текст» в полях StructArray не поддерживаются.
ArrayНе поддерживаетсяВ полях StructArray не поддерживаются подполя типа «Timestamptz» и выражения, связанные со временем.
Вложенные « Array », « ArrayOfVector », « Struct » или ArrayOfStructНе поддерживаетсяПоля StructArray не поддерживают вложенные подполя типа массив, вектор-массив, Struct или массив структур.

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

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

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

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

Примеры вставки с полями 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 учитываются как подполя вектора при планировании схемы коллекции. Общее количество векторных полей и подполей вектора должно укладываться в пределы, установленные для целевой версии и уровня обслуживания.

Поддерживаемые матрицы типов index и metric см. в разделе «Поля 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».