Consulta Condicional

Este tópico apresenta como realizar consultas condicionais.

Ao contrário das pesquisas de similaridade em vetores, as consultas condicionais recuperam vetores usando filtros escalares por meio de expressões booleanas. O Milvus suporta consultas em campos escalares e várias expressões booleanas. As expressões booleanas podem ser usadas para filtrar campos escalares ou campos de chave primária para recuperar todos os resultados que correspondem às condições de filtragem.

O exemplo a seguir demonstra como consultar um conjunto de dados de 2000 registros de livros, incluindo o ID do livro (chave primária), contagem de palavras (campo escalar) e introdução do livro (campo de vetor), simulando o cenário de consulta de um livro específico com base em seu ID.

Carregar Coleção

Antes de realizar uma consulta, a coleção precisa ser carregada na memória.

from pymilvus import Collection
colecao = Collection("livro")      # Obter uma coleção existente.
colecao.load()

Realizar Consulta

O exemplo a seguir filtra vetores com base em valores específicos de book_id e retorna os campos book_id e book_intro nos resultados.

O Milvus suporta definir níveis de consistência para consultas. O exemplo neste tópico define o nível de consistência como Forte. Você também pode definir o nível de consistência como Limitado, Sessão ou Eventualmente. Para obter mais informações sobre os quatro níveis de consistência no Milvus, consulte Consistência.

Você também pode usar campos dinâmicos na expressão de filtro e especificar campos de saída na solicitação de consulta. Por exemplo, consulte Esquema Dinâmico.

res = colecao.query(
  expr = "book_id in [2,4,6,8]",
  offset = 0,
  limit = 10, 
  output_fields = ["book_id", "book_intro"],
)

Parâmetro Descrição
expr Expressão booleana usada para filtrar propriedades. Para mais detalhes sobre as regras de expressão booleana, consulte Regras de Expressão Booleana.
limit Número de resultados mais semelhantes a serem retornados. A soma desse valor e offset deve ser menor que 16384.
offset Número de resultados a serem ignorados na coleção. Somente disponível quando limit é especificado, e a soma desse valor e limit deve ser menor que 16384. Por exemplo, se você deseja consultar os 9º e 10º vizinhos mais próximos de um vetor, defina limit como 2 e offset como 8.
output_fields (opcional) Lista de nomes de campo a serem retornados.
partition_names (opcional) Lista de nomes de partição a serem consultados.
consistency_level (opcional) Nível de consistência para a consulta.

Verifique os resultados retornados.

sorted_res = sorted(res, key=lambda k: k['book_id'])
sorted_res

Contar Entidades

Ao realizar uma consulta, você pode adicionar count(*) em output_fields para que o Milvus possa retornar o número de entidades na coleção. Se desejar contar o número de entidades que atendem a condições específicas, use expr para definir uma expressão booleana.

Contar todas as entidades na coleção:

res = colecao.query(
  expr="", 
  output_fields = ["count(*)"],
)

print(res)
print(res[0])

Contar o número de entidades que atendem a condições de filtragem específicas:

res = colecao.query(
  expr="book_id in [2,4,6,8]", 
  output_fields = ["count(*)"],
)

print(res)
print(res[0])

Limitações

Ao usar count(*) em output_fields, o uso do parâmetro limit é proibido.