Обзор 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 сравнивает список вложений запроса с сохраненным списком вложений, используя метрику « MAX_SIM* », и возвращает совпадающие объекты.

  • Данные запроса: список вложений.
  • Семейство метрик: « MAX_SIM* ».
  • Уровень детализации результатов: уровень сущности.
  • Наилучшее применение: поиск на поздних этапах взаимодействия на уровне документа или страницы.

Поиск на уровне элементов рассматривает каждый элемент Struct как независимый кандидат для векторного поиска. Каждый результат соответствует найденному элементу внутри поля StructArray, а в результатах без группировки может отображаться смещение элемента.

  • Данные запроса: обычный вектор.
  • Семейство метрик: метрики обычного вектора.
  • Уровень детализации результатов: уровень элементов Struct.
  • Оптимально подходит для: поиска на уровне фрагментов, клипов или участков.

Предупреждение

Если вашей коллекции требуется как поиск по 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_filter MATCH_* и предназначены для скалярных подполей внутри полей StructArray. Используйте оператор только внутри этих операторов. $[subfield]

  • Некоторые комбинации поиска зависят от версии или режима работы. Ознакомьтесь с ограничениями StructArray, прежде чем использовать поиск по диапазону, групповой поиск, гибридный поиск, поля с допустимыми нулевыми значениями или динамически добавленные поля.

Следующие шаги

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

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

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

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

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

ПереведеноDeepL

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?