Pesquisa vetorial básica com StructArray

Utilize esta página para efetuar uma pesquisa vetorial em subcampos vetoriais dentro de um campo StructArray. O StructArray suporta dois modos básicos de pesquisa vetorial: a pesquisa EmbeddingList, que avalia uma lista de incorporações armazenada em cada entidade, e a pesquisa ao nível do elemento, que pesquisa cada elemento Struct de forma independente.

Esta página utiliza a coleção « tech_articles » da secção «Criar um campo StructArray». A coleção possui um campo StructArray denominado « chunks ». Cada chunk contém texto, metadados escalares, um subcampo vetorial denominado « emb_list_vector » com um índice para a pesquisa EmbeddingList e um subcampo vetorial denominado « emb » com um índice para a pesquisa ao nível do elemento.

Antes de começar

Certifique-se de que o esquema da coleção, os dados e os índices já estão preparados.

RequisitoOnde preparar
Crie um campo StructArray, como chunks.Criar um campo StructArray
Inserir entidades cujo campo « chunks » contenha objetos Struct.Inserir dados nos campos StructArray
Crie um índice « MAX_SIM* » no « chunks[emb_list_vector] » para a pesquisa «EmbeddingList».Indexar campos StructArray
Criar um índice métrico vetorial regular em « chunks[emb] » para pesquisa ao nível dos elementos.Indexar campos StructArray

Aviso

Um campo vetorial ou subcampo vetorial aceita apenas um índice. Se precisar tanto da pesquisa EmbeddingList como da pesquisa ao nível do elemento, crie dois subcampos vetoriais separados. Nesta página, chunks[emb_list_vector] é indexado para a pesquisa EmbeddingList e chunks[emb] é indexado para a pesquisa ao nível do elemento.

Escolha um modo de pesquisa

AspectoPesquisa na EmbeddingListPesquisa ao nível do elemento
Subcampo de destinochunks[emb_list_vector]chunks[emb]
Dados da consultaUma lista de incorporação que contém um ou mais vetores.Um vetor normal.
Família de métricasMAX_SIM*, como MAX_SIM_COSINE.Métricas de vetores regulares, como COSINE, IP ou L2.
O que representa um resultadoUma entidade correspondente cujo subcampo vetorial StructArray é semelhante à lista de embeddings da consulta.Um elemento Struct correspondente dentro do campo StructArray.
Granularidade do resultadoNível de entidade.Nível do elemento Struct.
DeslocamentoNão aplicável.Identifica a posição, a partir do zero, do elemento Struct correspondente quando devolvido.
Utilização típicaColBERT, ColPali e outros padrões de recuperação de interação tardia.Recuperação ao nível de fragmento, de passagem, de clipe, de patch ou de facto.

Utilize a pesquisa EmbeddingList quando a própria consulta contiver vários vetores e o subcampo do vetor StructArray de destino estiver indexado com uma métrica de « MAX_SIM* ». O resultado é uma correspondência ao nível da entidade.

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"])

Neste modo de pesquisa, a « limit » controla quantas entidades são devolvidas para cada consulta. O resultado pode incluir subcampos «StructArray», mas o próprio resultado representa a entidade-pai correspondente, em vez de um elemento «Struct» específico.

Para um guia passo a passo completo ao estilo ColBERT ou ColPali, consulte «Pesquisa com listas de incorporação». Esta página aborda apenas o comportamento básico da pesquisa no StructArray.

Utilize a pesquisa ao nível do elemento quando cada elemento Struct deva participar na pesquisa vetorial de forma independente. A consulta é um vetor normal e o subcampo do vetor de destino deve ser indexado com uma métrica de vetor normal.

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"],
        )

Na pesquisa ao nível do elemento, cada resultado representa um elemento Struct correspondente. O valor « offset » é a posição, com início em zero, desse elemento no campo StructArray. A mesma entidade pode aparecer mais do que uma vez se mais do que um elemento Struct corresponder à consulta. O valor « limit » aplica-se aos resultados dos elementos, e não a entidades-pai únicas.

Interpretar resultados

Item de resultadoPesquisa EmbeddingListPesquisa ao nível do elemento
idChave primária da entidade correspondente.Chave primária da entidade que contém o elemento Struct correspondente.
distance ou pontuaçãoPontuação ou distância entre a lista de embeddings da consulta e a lista de embeddings armazenada.Pontuação ou distância entre o vetor da consulta e o vetor do elemento Struct correspondente.
offsetNão aplicável.Posição, a partir de zero, do elemento Struct correspondente quando devolvido.
Chaves primárias repetidasNão é esperado para uma única consulta, uma vez que os resultados são ao nível da entidade.Possível, uma vez que vários elementos Struct na mesma entidade podem corresponder.
Campos de saída StructArray solicitadosDevolvidos a partir da entidade correspondente.Devolvidos com a forma de correspondência ao nível do elemento suportada pela API e pelo SDK de destino.

Erros comuns

  • Utilizar « chunks.emb » em vez da sintaxe de caminho de subcampo exigida « chunks[emb] ».

  • Utilizar uma consulta EmbeddingList num subcampo vetorial indexado com uma métrica vetorial normal.

  • Utilizar uma consulta vetorial normal num subcampo vetorial indexado com uma métrica « MAX_SIM* ».

  • Esperar que a pesquisa ao nível do elemento « limit » devolva esse número de entidades-pai únicas. Ela devolve resultados ao nível do elemento.

  • Esperar que a pesquisa «EmbeddingList» devolva um deslocamento específico de um elemento. Devolve correspondências ao nível da entidade.

  • Reutilizar um subcampo vetorial para ambos os modos de pesquisa. Utilize subcampos vetoriais separados, uma vez que cada subcampo vetorial aceita apenas um índice.

Próximos passos

  1. Para restringir a pesquisa ao nível do elemento por condições escalares, consulte «Pesquisa filtrada com StructArray».

  2. Para pesquisar por limites de pontuação ou distância, leia «Pesquisa por intervalo com StructArray».

  3. Para devolver, no máximo, um resultado por entidade-pai após uma pesquisa ao nível do elemento, leia «Pesquisa agrupada com StructArray».

  4. Para combinar a pesquisa com StructArray com outras pesquisas vetoriais, consulte «Pesquisa híbrida com StructArray».

  5. Para consultar os tipos de dados, métricas, filtros e limites específicos da versão suportados, leia «Limites do StructArray».

Traduzido porDeepL

Experimente o Milvus gerenciado gratuitamente

O Zilliz Cloud é descomplicado, powered by Milvus e 10x mais rápido.

Começar
Feedback

Esta página foi útil?