Agrupamento de resultados de pesquisa com StructArray
Utilize esta página para agrupar os resultados da pesquisa ao nível dos elementos do StructArray por entidade pai. A pesquisa ao nível dos elementos pode devolver vários resultados da mesma entidade quando vários elementos Struct correspondem à consulta. O agrupamento agrupa esses resultados de elementos de forma a que cada entidade pai apareça, no máximo, uma vez.
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 ». O subcampo vetorial « chunks[emb] » está indexado para pesquisa ao nível do elemento com uma métrica vetorial regular.
Como o agrupamento se aplica ao StructArray
| Modo de pesquisa | Comportamento do agrupamento | Comportamento dos resultados |
|---|---|---|
| Pesquisa EmbeddingList | Não suportado. | Não aplicável. |
| Pesquisa ao nível do elemento | Suportado através do agrupamento pela chave primária. | Retorna, no máximo, um resultado por entidade pai. Os metadados ao nível do elemento são preservados, pelo que o índice ou deslocamento do elemento selecionado pode ser devolvido quando exposto pela API ou pelo SDK. |
| Pesquisa híbrida | Suportada apenas quando todas as subpesquisas têm como alvo campos vetoriais ao nível do elemento no âmbito do mesmo campo StructArray. | As subpesquisas ao nível do elemento são agrupadas pela chave primária antes do tratamento do resultado final. |
Utilize o agrupamento quando a pesquisa ao nível do elemento, sem agrupamento, devolver demasiadas entidades-pai duplicadas. Se pretender que cada elemento Struct correspondente seja considerado um resultado individual, utilize a Pesquisa Vetorial Básica com StructArray sem a opção « group_by_field ».
Antes de começar
Prepare a coleção, os dados e os índices antes de executar a pesquisa com agrupamento.
| Requisito | Detalhes |
|---|---|
| Subcampo vetorial ao nível do elemento | Utilize um subcampo vetorial StructArray, como chunks[emb], indexado com uma métrica vetorial regular. |
| Consulta vetorial normal | Utilize um vetor de consulta regular, e não um ` EmbeddingList`. |
| Agrupamento por chave primária | Utilize a chave primária da coleção como um ` group_by_field`, tal como ` doc_id`. |
| Sem parâmetros de intervalo | Não combine a pesquisa de agrupamento com parâmetros de pesquisa de intervalo, como radius ou range_filter. |
Para a configuração do índice, consulte Campos StructArray do Índice.
Executar pesquisa agrupada ao nível do elemento
O exemplo seguinte pesquisa primeiro blocos individuais e, em seguida, agrupa os resultados dos elementos pela chave primária da entidade pai.
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus",
)
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,
group_by_field="doc_id",
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"],
)
Sem o agrupamento, o mesmo doc_id pode aparecer várias vezes se vários blocos corresponderem à consulta. Com group_by_field="doc_id", cada entidade pai aparece, no máximo, uma vez. O agrupamento preserva os metadados ao nível do elemento, pelo que o resultado agrupado pode ainda incluir o índice ou o deslocamento do elemento Struct selecionado, quando a API ou o SDK o expuserem.
Adicionar filtros escalares
Pode combinar a pesquisa agrupada com a filtragem escalar do StructArray. Utilize « element_filter » quando a condição escalar deva restringir quais os elementos Struct que participam na pesquisa vetorial ao nível do elemento.
filter_expr = (
'category == "search" && '
'element_filter(chunks, '
'$[section] == "index" && '
'$[quality_score] > 0.9)'
)
results = client.search(
collection_name="tech_articles",
data=[query_vector],
anns_field="chunks[emb]",
filter=filter_expr,
limit=5,
group_by_field="doc_id",
output_fields=[
"doc_id",
"title",
"category",
"chunks[text]",
"chunks[section]",
"chunks[quality_score]",
],
)
O predicado de nível superior seleciona as entidades candidatas. O predicado « element_filter » restringe a pesquisa vetorial ao nível do elemento aos elementos Struct correspondentes. O agrupamento agrupa então os resultados dos elementos correspondentes pela chave primária.
Utilizar o agrupamento na pesquisa híbrida
O agrupamento híbrido com StructArray é uma funcionalidade ao nível do elemento. Só é suportado quando todas as sub-pesquisas têm como alvo campos vetoriais ao nível do elemento no âmbito do mesmo campo StructArray. Não utilize pedidos ao nível de EmbeddingList numa pesquisa híbrida agrupada de StructArray.
O exemplo seguinte pressupõe que o campo StructArray « chunks » tem dois subcampos vetoriais ao nível do elemento, « chunks[emb] » e « chunks[code_emb] », e que ambos estão indexados com métricas vetoriais regulares.
from pymilvus import AnnSearchRequest, RRFRanker
index_chunk_req = AnnSearchRequest(
data=[query_vector],
anns_field="chunks[emb]",
limit=10,
expr='element_filter(chunks, $[section] == "index")',
)
code_chunk_req = AnnSearchRequest(
data=[code_query_vector],
anns_field="chunks[code_emb]",
limit=10,
expr='element_filter(chunks, $[has_code] == true)',
)
results = client.hybrid_search(
collection_name="tech_articles",
reqs=[index_chunk_req, code_chunk_req],
ranker=RRFRanker(),
limit=5,
group_by_field="doc_id",
output_fields=[
"doc_id",
"title",
"chunks[text]",
"chunks[section]",
],
)
Neste exemplo, ambas as sub-solicitações têm como alvo campos vetoriais ao nível do elemento no âmbito do mesmo campo StructArray, chunks. Uma pesquisa híbrida não suporta o agrupamento ao nível do elemento se misturar campos vetoriais normais, campos StructArray diferentes ou solicitações ao nível da EmbeddingList.
Interpretar resultados agrupados
| Item de resultado | Significado |
|---|---|
id | Chave primária da entidade-pai agrupada. |
distance ou pontuação | Pontuação ou distância do elemento Struct selecionado para essa entidade pai. |
offset | Posição, a partir de zero, do elemento Struct selecionado quando devolvido. |
| Chaves primárias repetidas | Não esperadas ao agrupar pela chave primária. |
limit | Aplica-se aos resultados agrupados da entidade pai. |
Limitações
A pesquisa de agrupamento aplica-se apenas à pesquisa de vetores StructArray ao nível do elemento. A pesquisa EmbeddingList e a pesquisa híbrida ao nível de EmbeddingList não suportam o agrupamento.
Utilize a chave primária como «
group_by_field». O agrupamento ao nível do elemento StructArray não é um agrupamento de uso geral sobre campos escalares arbitrários.Não combine a pesquisa de agrupamento com a pesquisa por intervalo.
Não utilize uma consulta «
EmbeddingList» nem uma métrica «MAX_SIM*» para a pesquisa agrupada.O agrupamento híbrido só é suportado quando todas as sub-pesquisas têm como alvo campos vetoriais ao nível do elemento no âmbito do mesmo campo StructArray.
O agrupamento híbrido não é suportado quando a pesquisa híbrida mistura um campo vetorial normal, um campo StructArray diferente ou um pedido ao nível de EmbeddingList.
Erros comuns
Utilizar o agrupamento com `
chunks[emb_list_vector]`, que se destina à pesquisa EmbeddingList.Agrupamento por um campo escalar que não seja a chave primária.
Agrupamento por vários campos. O agrupamento de StructArray ao nível do elemento suporta apenas o agrupamento por chave primária.
Esperar que os resultados agrupados representem todos os elementos Struct correspondentes. O agrupamento devolve, no máximo, um resultado por entidade pai.
Presumir que a pesquisa agrupada ao nível do elemento recalcula uma pontuação de tipo «
MAX_SIM*» no estilo «EmbeddingList». O agrupamento agrupa os resultados ao nível do elemento; não altera o modelo de pontuação.Combinação de «
group_by_field» com «radius» ou «range_filter».
Próximos passos
Para aprender primeiro a pesquisa ao nível do elemento sem agrupamento, leia «Pesquisa vetorial básica com StructArray».
Para adicionar filtros escalares à pesquisa agrupada, leia «Pesquisa Filtrada com StructArray».
Para utilizar limites de pontuação ou distância em vez de agrupamento, leia «Pesquisa por intervalo com StructArray».
Para verificar os limites de pesquisa do StructArray, leia «Limites do StructArray».