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.
| Requisito | Onde 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
| Aspecto | Pesquisa na EmbeddingList | Pesquisa ao nível do elemento |
|---|---|---|
| Subcampo de destino | chunks[emb_list_vector] | chunks[emb] |
| Dados da consulta | Uma lista de incorporação que contém um ou mais vetores. | Um vetor normal. |
| Família de métricas | MAX_SIM*, como MAX_SIM_COSINE. | Métricas de vetores regulares, como COSINE, IP ou L2. |
| O que representa um resultado | Uma entidade correspondente cujo subcampo vetorial StructArray é semelhante à lista de embeddings da consulta. | Um elemento Struct correspondente dentro do campo StructArray. |
| Granularidade do resultado | Nível de entidade. | Nível do elemento Struct. |
| Deslocamento | Não aplicável. | Identifica a posição, a partir do zero, do elemento Struct correspondente quando devolvido. |
| Utilização típica | ColBERT, 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. |
Executar pesquisa EmbeddingList
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.
Executar pesquisa ao nível do elemento
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 resultado | Pesquisa EmbeddingList | Pesquisa ao nível do elemento |
|---|---|---|
id | Chave primária da entidade correspondente. | Chave primária da entidade que contém o elemento Struct correspondente. |
distance ou pontuação | Pontuaçã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. |
offset | Não aplicável. | Posição, a partir de zero, do elemento Struct correspondente quando devolvido. |
| Chaves primárias repetidas | Nã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 solicitados | Devolvidos 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
Para restringir a pesquisa ao nível do elemento por condições escalares, consulte «Pesquisa filtrada com StructArray».
Para pesquisar por limites de pontuação ou distância, leia «Pesquisa por intervalo com StructArray».
Para devolver, no máximo, um resultado por entidade-pai após uma pesquisa ao nível do elemento, leia «Pesquisa agrupada com StructArray».
Para combinar a pesquisa com StructArray com outras pesquisas vetoriais, consulte «Pesquisa híbrida com StructArray».
Para consultar os tipos de dados, métricas, filtros e limites específicos da versão suportados, leia «Limites do StructArray».