Базовый векторный поиск с использованием StructArray

Используйте эту страницу для выполнения векторного поиска по подполям вектора внутри поля StructArray. StructArray поддерживает два основных режима векторного поиска: поиск по списку вложений (EmbeddingList), при котором оценивается список вложений, хранящийся в каждой сущности, и поиск на уровне элементов, при котором каждый элемент Struct просматривается независимо.

На этой странице используется коллекция « tech_articles » из раздела «Создание поля StructArray». В коллекции имеется поле StructArray с именем « chunks ». Каждый фрагмент содержит текст, скалярные метаданные, векторное подполе с именем « emb_list_vector » с индексом для поиска по списку вложений, а также векторное подполе с именем « emb » с индексом для поиска на уровне элементов.

Перед началом работы

Убедитесь, что схема коллекции, данные и индексы уже подготовлены.

ТребованияГде это подготовить
Создайте поле StructArray, например chunks.Создание поля StructArray
Вставьте сущности, поле « chunks » которых содержит объекты Struct.Вставка данных в поля StructArray
Создайте индекс MAX_SIM* на chunks[emb_list_vector] для поиска по EmbeddingList.Индексирование полей StructArray
Создайте обычный векторно-метрический индекс на поле « chunks[emb] » для поиска на уровне элементов.Индексирование полей StructArray

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

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

Выберите режим поиска

АспектПоиск по EmbeddingListПоиск на уровне элементов
Целевое подполеchunks[emb_list_vector]chunks[emb]
Данные запросаСписок вложений, содержащий один или несколько векторов.Обычный вектор.
Семейство метрикMAX_SIM*, например MAX_SIM_COSINE.Обычные векторные метрики, такие как COSINE, IP или L2.
Что представляет собой один результатСоответствующий объект, подполе вектора StructArray которого схоже со списком вложений запроса.Соответствующий элемент Struct внутри поля StructArray.
Детализация результатовУровень сущности.Уровень элемента Struct.
СмещениеНе применимо.Определяет позицию сопоставленного элемента структуры с нулевым индексом при возвращении.
Типичное использованиеColBERT, ColPali и другие шаблоны поиска с поздним взаимодействием.Поиск на уровне фрагментов, абзацев, клипов, патчей или фактов.

Используйте поиск EmbeddingList, если сам запрос содержит несколько векторов, а целевое подполе вектора StructArray индексируется с помощью метрики « MAX_SIM* ». Результатом является совпадение на уровне сущностей.

from pymilvus import MilvusClient
from pymilvus.client.embedding_list import EmbeddingList

client = MilvusClient(
    uri="http://localhost:19530",
    token="root:Milvus",
)

query = EmbeddingList()
query.add([0.12, 0.21, 0.32, 0.44])
query.add([0.18, 0.23, 0.29, 0.36])

results = client.search(
    collection_name="tech_articles",
    data=[query],
    anns_field="chunks[emb_list_vector]",
    limit=3,
    output_fields=[
        "doc_id",
        "title",
        "category",
        "chunks[text]",
        "chunks[section]",
    ],
)

for hits in results:
    for hit in hits:
        print(hit["id"], hit["distance"], hit["entity"])

В этом режиме поиска параметр « limit » определяет, сколько сущностей будет возвращено по каждому запросу. Результат может включать подполя StructArray, однако само совпадение представляет собой найденную родительскую сущность, а не какой-то конкретный элемент Struct.

Полное руководство по работе с ColBERT или ColPali см. в разделе «Поиск с использованием списков вложений». На этой странице рассматриваются только основные особенности поиска по StructArray.

Используйте поиск на уровне элементов, когда каждый элемент Struct должен участвовать в векторном поиске независимо. Запрос представляет собой обычный вектор, а целевое подполе вектора должно индексироваться с помощью обычной векторной метрики.

query_vector = [0.19, 0.24, 0.30, 0.37]

results = client.search(
    collection_name="tech_articles",
    data=[query_vector],
    anns_field="chunks[emb]",
    limit=5,
    output_fields=[
        "doc_id",
        "title",
        "chunks[text]",
        "chunks[section]",
        "chunks[page]",
        "chunks[quality_score]",
    ],
)

for hits in results:
    for hit in hits:
        print(
            "doc_id:", hit["id"],
            "distance:", hit["distance"],
            "offset:", hit.get("offset"),
            "entity:", hit["entity"],
        )

При поиске на уровне элементов каждый результат соответствует найденному элементу Struct. Значение « offset » представляет собой позицию этого элемента в поле StructArray, начиная с нуля. Один и тот же объект может появиться более одного раза, если запросу соответствует более одного элемента Struct. Значение « limit » применяется к найденным элементам, а не к уникальным родительским объектам.

Интерпретация результатов

Элемент результатаПоиск по списку вложений (EmbeddingList)Поиск на уровне элементов
idПервичный ключ найденного объекта.Первичный ключ сущности, содержащей найденный элемент Struct.
distance или оценкаОценка или расстояние между списком вложений запроса и сохраненным списком вложений.Оценка или расстояние между вектором запроса и вектором найденного элемента Struct.
offsetНе применимо.Позиция соревнования элемента Struct с нулевым индексом при возвращении.
Повторяющиеся первичные ключиНе ожидается для отдельного запроса, поскольку результаты предоставляются на уровне сущности.Возможно, поскольку могут совпадать несколько элементов Struct в одной сущности.
Запрашиваемые поля вывода StructArrayВозвращаются из найденной сущности.Возвращаются с формой совпадения на уровне элементов, поддерживаемой целевым API и SDK.

Распространенные ошибки

  • Использование chunks.emb вместо требуемого синтаксиса пути к подполю chunks[emb].

  • Использование запроса EmbeddingList для векторного подполя, индексированного с помощью обычной векторной метрики.

  • Использование обычного векторного запроса к векторному подполю, индексированному с помощью метрики MAX_SIM*.

  • Ожидание того, что поиск на уровне элементов limit вернет столько же уникальных родительских сущностей. Он возвращает совпадения на уровне элементов.

  • Ожидается, что поиск EmbeddingList вернет одно конкретное смещение элемента. Вместо этого возвращаются совпадения на уровне сущностей.

  • Повторное использование одного векторного подполя для обоих режимов поиска. Используйте отдельные векторные подполя, поскольку каждое векторное подполе допускает только один индекс.

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

  1. Чтобы ограничить поиск на уровне элементов с помощью скалярных условий, ознакомьтесь с разделом «Фильтрованный поиск с использованием StructArray».

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

  3. Чтобы после поиска на уровне элементов возвращалось не более одного результата на родительский объект, ознакомьтесь с разделом «Групповой поиск с использованием StructArray».

  4. Чтобы объединить поиск с использованием StructArray с другими векторными поисками, ознакомьтесь с разделом «Гибридный поиск с использованием StructArray».

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

ПереведеноDeepL

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

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

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

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