Обзор StructArray
Используйте StructArray, когда одному объекту необходимо хранить упорядоченный список структурированных элементов, например один документ, состоящий из множества фрагментов, одну страницу с множеством визуальных блоков или одно видео, состоящее из множества клипов. StructArray хранит эти элементы внутри родительского объекта, при этом позволяя выполнять векторный поиск и скалярную фильтрацию по полям внутри каждого элемента.
Что такое StructArray?
StructArray, также известный как массив структур, хранит упорядоченный набор элементов Struct в каждом объекте. Каждый элемент Struct в массиве соответствует одной и той же схеме. Элемент Struct может содержать скалярные подполя, векторные подполя или и те, и другие.
Например, коллекция может хранить одну статью в качестве сущности, а её фрагменты — в поле StructArray с именем chunks. Каждый фрагмент может включать текст, метаданные раздела, оценки качества и одно или несколько векторных вложений.
{
"doc_id": 1,
"title": "Vector search tuning guide",
"category": "search",
"title_vector": [0.10, 0.20, 0.30, 0.40],
"chunks": [
{
"text": "Use HNSW efSearch to trade recall for latency.",
"section": "index",
"page": 1,
"quality_score": 0.92,
"has_code": true,
"emb_list_vector": [0.11, 0.21, 0.31, 0.41],
"emb": [0.12, 0.20, 0.33, 0.39]
},
{
"text": "Range search returns vectors within a distance boundary.",
"section": "search",
"page": 2,
"quality_score": 0.86,
"has_code": false,
"emb_list_vector": [0.18, 0.23, 0.29, 0.36],
"emb": [0.19, 0.24, 0.30, 0.37]
}
]
}
Два векторных подполя в этом примере представляют один и тот же фрагмент с двух точек зрения поиска. Поле « chunks[emb_list_vector] » предназначено для поиска по списку вложений (EmbeddingList) с использованием метрик « MAX_SIM* », а поле « chunks[emb] » — для поиска на уровне элементов с использованием обычных векторных метрик, таких как « COSINE », « IP » или « L2 ».
Когда использовать StructArray
Используйте StructArray, если естественная единица, которую вы хотите вернуть, больше естественной единицы, по которой вы хотите выполнять поиск или фильтрацию.
| Пример использования | Почему StructArray помогает | Типичное поле StructArray |
|---|---|---|
| Поиск документов | Хранение одного документа в виде сущности при поиске по его фрагментам. | chunks |
| Поиск с поздним взаимодействием | Хранение документа или страницы в виде списка вложений и оценка с помощью MAX_SIM*. | chunks[emb_list_vector] или patches[emb] |
| Поиск на уровне элементов | Возвращайте наиболее релевантный фрагмент, клип, патч или наблюдение, включая его смещение в массиве. | chunks[emb] |
| Структурированная фильтрация | Фильтрация по скалярным подполям внутри элементов Struct, таких как section, score, page или flags. | chunks[section], chunks[quality_score] |
| Уменьшение количества дубликатов результатов родительских элементов | Сохраняйте дочерние элементы под одним и тем же родительским объектом вместо того, чтобы хранить каждый дочерний элемент в отдельной строке. | chunks, clips, patches |
Матрица принятия решений
Используйте следующую матрицу для выбора подходящего пути StructArray.
| Цель | Рекомендуемый путь | Уровень детализации результатов | Начните с этого |
|---|---|---|---|
| Моделируйте один родительский объект со множеством структурированных дочерних объектов. | Создайте поле StructArray. | Сущность содержит упорядоченные элементы Struct. | Создание поля StructArray |
| Вставьте родительские записи с вложенными данными дочерних элементов. | Вставка сущностей, поле StructArray которых представляет собой список объектов Struct. | Вставка на уровне сущности. | Вставка данных в поля StructArray |
| Запустить ColBERT, ColPali или поиск с поздним взаимодействием на уровне документа. | Использовать поиск по EmbeddingList с индексом « MAX_SIM* ». | Уровень сущностей. | Поиск с помощью списков вложений |
| Поиск отдельных фрагментов, клипов или участков. | Используйте поиск на уровне элементов с помощью обычной векторной метрики. | Уровень элементов Struct, с учетом смещения, если оно доступно. | Базовый векторный поиск с StructArray |
| Ограничьте векторный поиск на уровне элементов элементами, соответствующими скалярным условиям. | Используйте ` element_filter`. | Фильтрация на уровне элементов; форма результата зависит от типа поиска. | Поиск с фильтрацией с помощью StructArray |
| Выберите объекты в зависимости от того, сколько элементов Struct удовлетворяют условию. | Используйте команды « MATCH_ANY », « MATCH_ALL », « MATCH_LEAST », « MATCH_MOST » или « MATCH_EXACT ». | Уровень объекта. | Операторы StructArray |
| Используйте границы по оценке или расстоянию для подполей вектора StructArray. | Используйте поиск по диапазону на уровне элементов. | Уровень элемента Struct. | Поиск по диапазону с StructArray |
| Возвращайте не более одного результата на каждую родительскую сущность после поиска на уровне элементов. | Используйте поиск с группировкой по первичному ключу. | Уровень сущности после группировки. | Групповой поиск с StructArray |
| Объедините поиск по элементам StructArray с другим векторным полем. | Используйте гибридный поиск с одним запросом AnnSearchRequest, нацеленным на векторное подполе StructArray. | Поиск на уровне элементов, переранжирование на уровне сущностей. | Гибридный поиск с StructArray |
Понимание двух моделей поиска
Поиск по EmbeddingList |
Поиск на уровне элементов |
|---|---|
|
Поиск по EmbeddingList рассматривает векторы внутри подполя вектора StructArray как один список вложений для родительского объекта. Запрос также представляет собой список вложений. Milvus сравнивает список вложений запроса с сохраненным списком вложений, используя метрику «
|
Поиск на уровне элементов рассматривает каждый элемент Struct как независимый кандидат для векторного поиска. Каждый результат соответствует найденному элементу внутри поля StructArray, а в результатах без группировки может отображаться смещение элемента.
|
Предупреждение
Если вашей коллекции требуется как поиск по EmbeddingList, так и поиск на уровне элементов, используйте два отдельных векторных подполя. Векторное поле или векторное подполе принимает только один индекс, а для этих двух режимов поиска требуются разные семейства метрик.
Карта документации
Документация по StructArray разделена на страницы, посвященные моделированию, и страницы, посвященные поиску. Используйте страницы по моделированию для определения и подготовки данных. Используйте страницы по поиску, чтобы выбрать подходящее поведение поиска и фильтрации.
| Область | Страница | Используйте для |
|---|---|---|
| Моделирование | Создание поля StructArray | Определите схему структуры и добавьте поле StructArray. |
| Моделирование | Вставка данных в поля StructArray | Подготовьте и вставьте вложенные данные StructArray. |
| Моделирование | Индексирование полей StructArray | Создание векторных и скалярных индексов для полей StructArray. |
| Справочная информация | Ограничения StructArray | Проверка ограничений схемы, типов данных, индексов, поиска, фильтрации и версий. |
| Поиск | Базовый векторный поиск с использованием StructArray | Сравните поиск по EmbeddingList и векторный поиск на уровне элементов. |
| Поиск | Поиск по диапазону с StructArray | Используйте ограничения диапазона с подполями вектора StructArray. |
| Поиск | Групповой поиск с StructArray | Группировка результатов поиска на уровне элементов по первичному ключу. |
| Поиск | Гибридный поиск с StructArray | Объединение поиска на уровне элементов StructArray с другими векторными поисками. |
| Поиск | Поиск с фильтрами с использованием StructArray | Используйте фильтры StructArray при поиске, запросе и гибридном поиске. |
| Поиск | Поиск с использованием списков вложений | Создавайте системы поиска в стиле ColBERT и ColPali с помощью StructArray. |
| Фильтр | Операторы StructArray | Справочный синтаксис для операторов element_filter и MATCH_*. |
Основные ограничения, которые следует проверить в первую очередь
Struct можно использовать в качестве типа элемента поля Array. Он не используется в качестве поля коллекции верхнего уровня.
Все элементы Struct в одном поле StructArray используют одну предопределенную схему.
Для подполей Vector требуются индексы. При поиске с помощью EmbeddingList используются метрики
MAX_SIM*, а при поиске на уровне элементов — обычные векторные метрики.element_filterMATCH_*и предназначены для скалярных подполей внутри полей StructArray. Используйте оператор только внутри этих операторов.$[subfield]Некоторые комбинации поиска зависят от версии или режима работы. Ознакомьтесь с ограничениями StructArray, прежде чем использовать поиск по диапазону, групповой поиск, гибридный поиск, поля с допустимыми нулевыми значениями или динамически добавленные поля.
Следующие шаги
Чтобы разработать схему, ознакомьтесь с разделом «Создание поля StructArray».
Чтобы подготовить данные, ознакомьтесь с разделом «Вставка данных в поля StructArray».
Чтобы выбрать индексы, ознакомьтесь с разделом «Индексирование полей StructArray».
Чтобы выполнить поиск по векторным подполям StructArray, начните с раздела «Базовый векторный поиск с StructArray».
Чтобы отфильтровать скалярные подполя StructArray, ознакомьтесь с разделами «Операторы StructArray » и «Фильтрованный поиск с использованием StructArray».