Ограничения 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, либо для поиска на уровне элементов. Одно и то же векторное подполе не может использовать обе семьи метрик, поскольку каждое векторное поле или векторное подполе принимает только один индекс.
| Режим поиска | Семейство метрик | Уровень результата |
|---|---|---|
| Поиск по EmbeddingList | MAX_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`, вместо простых булевых выражений.
Связанные страницы
Чтобы создать поле StructArray, ознакомьтесь со статьёй «Создание поля StructArray».
Для вставки данных ознакомьтесь с разделом «Вставка данных в поля StructArray».
Чтобы создать векторные и скалярные индексы, ознакомьтесь с разделом «Индексирование полей StructArray».
Чтобы ознакомиться с синтаксисом фильтров StructArray, прочтите раздел «Операторы StructArray».