Filtragem de Metadados no Milvus: Filtragem de JSON e Metadados no Milvus
JSON, ou JavaScript Object Notation, é um formato de dados flexível para armazenamento e transmissão. Ele usa pares chave-valor de forma adaptativa, tornando-o perfeito para bancos de dados NoSQL e resultados de API. Por causa de sua flexibilidade, é um formato de dados popular. Parâmetros de busca são cruciais para definir os detalhes específicos de cada solicitação de busca, como os campos vetoriais usados, os vetores de consulta e os limites do número de resultados retornados.
Muitas demonstrações do Milvus começam com dados de texto brutos, como tipos de arquivo .txt, .pdf ou .csv. Mas você sabia que pode carregar e trabalhar com JSON bruto com o Milvus? Veja esta página de documentação de JSON para mais detalhes.
Milvus Client é um wrapper em torno do objeto de coleção do Milvus que usa um formato JSON flexível “key”:value para permitir definições de dados sem schema. Veja a documentação do Milvus Client para mais informações.
O Milvus Client sem schema e o nível gratuito na nuvem da Zilliz são uma ótima maneira de usar o Milvus rapidamente! O Milvus Client é quase tão rápido quanto definir um schema completo antecipadamente, mas com codificação menos propensa a erros. Comparado a “enable_dynamic_field”, o Milvus Client é muito mais rápido, oferecendo uma abordagem mais suave para usar menos definição de schema antecipadamente. O schema sem schema é:
- id (str): Nome do campo de chave primária.
- vector (str): Nome do campo vetorial.
É isso! O restante dos campos pode ser determinado de forma flexível quando os dados são inseridos no Milvus.
Para tornar isso mais concreto, vamos direto a alguns exemplos de código sobre como usar o Milvus Client. O código completo está no meu repositório Bootcamp no github.
Exemplo de código - carregue dados JSON brutos diretamente no Milvus
Os dados brutos em si poderiam estar no formato JSON. Isso é útil, por exemplo, se seus dados vêm de um banco de dados NoSQL, como MongoDB. Abaixo, os dados JSON usados são a classificação de gêneros de filmes do IMDB do Kaggle
# !pip install numpy pandas json pprint pymilvus torch sentence-transformers
# Import common libraries.
import pandas as pd
import json
# Read JSON data.
df = pd.read_json('data/tiny_parsed_data.json')
# Concatenate Title and Description into 'text' column.
df['text'] = df['title'] + ' ' + df['description']
display(df.head(2))
Inicie um servidor de avaliação gratuita na nuvem da Zilliz. Você pode ter até 2 coleções, cada uma com até 1 milhão de vetores, em uma avaliação gratuita por vez. O código neste notebook usa fully-man
- Escolha a opção padrão "Starter" quando você provisionar > Create collection > Give it a name > Create cluster and collection.
- Na página principal do Cluster, copie sua
API Keye armazene-a localmente em uma variável .env ‘ZILLIZ_API_KEY’. - Também na página principal do Cluster, copie o
Public Endpoint URI.
import os
from pymilvus import connections, utility
TOKEN = os.getenv("ZILLIZ_API_KEY")
# Connect to Zilliz cloud using endpoint URI and API key TOKEN.
CLUSTER_ENDPOINT="https://in03-xxxx.api.gcp-us-west1.zillizcloud.com:443"
connections.connect(
alias='default',
token=TOKEN,
uri=CLUSTER_ENDPOINT,)
# Check if the server is ready and get collection name.
print(f"Type of server: {utility.get_server_version()}")
Escolha um modelo de embedding. Abaixo, escolhi um da HuggingFace. Estou executando isso no meu laptop, então preciso garantir que DEVICE=cpu.
import torch
from sentence_transformers import SentenceTransformer
# Initialize torch settings
torch.backends.cudnn.deterministic = True
DEVICE = torch.device('cuda:3' if torch.cuda.is_available() else 'cpu')
# Carregue o modelo do hub de modelos da Hugging Face.
model_name = "WhereIsAI/UAE-Large-V1"
encoder = SentenceTransformer(model_name, device=DEVICE)
# Obtenha os parâmetros do modelo e salve para depois.
EMBEDDING_DIM = encoder.get_sentence_embedding_dimension()
MAX_SEQ_LENGTH_IN_TOKENS = encoder.get_max_seq_length()
# Veja os parâmetros do modelo.
print(f"model_name: {model_name}")
print(f"EMBEDDING_DIM: {EMBEDDING_DIM}")
print(f"MAX_SEQ_LENGTH: {MAX_SEQ_LENGTH}")
Importe MilvusClient e crie a coleção. Observe que não precisamos especificar um esquema! Além disso, você pode simplesmente usar nosso índice padrão do sistema, chamado AUTOINDEX. No código aberto e no nível gratuito, o padrão é HNSW. Na nuvem paga da Zilliz, AUTOINDEX será ainda mais otimizado usando índices proprietários.
from pymilvus import MilvusClient
import pprint
# Set the Milvus collection name.
COLLECTION_NAME = "imdb_metadata"
# Use no-schema Milvus client.
mc = MilvusClient(
uri=CLUSTER_ENDPOINT,
token=TOKEN)
# Check if the collection already exists, if so drop it.
has = utility.has_collection(COLLECTION_NAME)
if has:
drop_result = utility.drop_collection(COLLECTION_NAME)
print(f"Successfully dropped collection: `{COLLECTION_NAME}`")
# Create the collection.
mc.create_collection(COLLECTION_NAME,
EMBEDDING_DIM,
consistency_level="Eventually",
auto_id=True,
overwrite=True,
# skip setting params, if using AUTOINDEX
)
print(f"Successfully created collection: `{COLLECTION_NAME}`")
pprint.pprint(mc.describe_collection(COLLECTION_NAME))
Uma estratégia simples de fragmentação é manter o campo ‘text’ como um único fragmento, a menos que ele exceda 512 caracteres de comprimento. Abaixo, podemos ver que o campo de texto dos dados JSON era bem curto. Nenhuma linha precisou ser dividida em fragmentos menores.
# Use the embedding model parameters.
chunk_size = 512
chunk_overlap = np.round(chunk_size * 0.10, 0)
# Chunk a batch of data from pandas DataFrame and inspect it.
BATCH_SIZE = 100
batch = imdb_chunk_text(BATCH_SIZE, df, chunk_size)
display(batch.head(2))
Agora que temos fragmentos de texto, embeddings vetoriais para cada fragmento de texto e todos os metadados originais, vamos inserir esses dados no banco de dados vetorial Milvus.
# Convert the DataFrame to a list of dictionaries
chunk_list = batch.to_dict(orient='records')
# Insert data into the Milvus collection.
start_time = time.time()
insert_result = mc.insert( COLLECTION_NAME, data=chunk_list, progress_bar=True )
end_time = time.time()
print(f"Milvus Client insert time for {batch.shape[0]} vectors: {end_time - start_time} seconds")
Vamos fazer uma pergunta e recuperar respostas dos nossos dados de filmes.
SAMPLE_QUESTION = "Dystopia science fiction with a robot."
# Embed the question using the same encoder.
query_embeddings = _utils.embed_query(encoder, [SAMPLE_QUESTION])
TOP_K = 2
# Run semantic vector search using your query and the vector database.
start_time = time.time()
results = mc.search(
COLLECTION_NAME,
data=query_embeddings,
output_fields=OUTPUT_FIELDS,
limit=TOP_K,
consistency_level="Eventually",
filter='film_year >= 2019', )
elapsed_time = time.time() - start_time
print(f"Milvus Client search time for {len(chunk_list)} vectors: {elapsed_time} seconds")
tempo de busca
Percorrendo os 2 principais resultados, vemos.
Isso parece muito bom. Mas e se quisermos fazer alguma filtragem de metadados no array JSON ‘Genres’?
Filtragem de metadados em campos JSON e arrays JSON
Um novo recurso no Milvus 2.3 é a capacidade de filtrar metadados JSON brutos. Abaixo, mostrarei um exemplo usando filtragem de metadados com um campo e um array.
Digamos que eu quisesse ver filmes mais antigos, mais retrô e estritamente do gênero Sci-Fi.
SAMPLE_QUESTION = "Dystopia science fiction with a robot."
# Embed the question using the same encoder.
query_embeddings = _utils.embed_query(encoder, [SAMPLE_QUESTION])
TOP_K = 2
# Run semantic vector search using your query and the vector database.
start_time = time.time()
results = mc.search(
COLLECTION_NAME,
data=query_embeddings,
output_fields=OUTPUT_FIELDS,
limit=TOP_K,
consistency_level="Eventually",
filter='json_contains(Genres, "Sci-Fi") and film_year < 2019',
)
elapsed_time = time.time() - start_time
print(f"Milvus Client search time for {len(chunk_list)} vectors: {elapsed_time} seconds")
Percorrendo os 2 principais resultados, agora as recomendações de filmes mudaram para corresponder ao filtro.
Muitas demonstrações do Milvus começam com dados de texto brutos, como tipos de arquivo .txt, .pdf ou .csv. Desta vez, vimos como carregar dados JSON diretamente em uma coleção de banco de dados vetorial do Milvus. Também vimos como usar a prática filtragem de metadados em campos JSON e a filtragem json_contains() em tipos de dados de array JSON. O código completo deste artigo do blog está no meu repositório GitHub do Bootcamp.
Introdução à Pesquisa Híbrida
A pesquisa híbrida é um recurso poderoso no Milvus que permite aos usuários combinar vários campos vetoriais em uma única pesquisa. Esse recurso é particularmente útil em cenários de pesquisa complexos, nos quais uma entidade pode ser representada por vários vetores diversos. Ao integrar os resultados de várias pesquisas vetoriais usando estratégias de reranking, a pesquisa híbrida permite que os usuários alcancem maior precisão e resultados mais relevantes.
No Milvus, a pesquisa híbrida pode ser usada para combinar diferentes tipos de dados, como texto, imagens e áudio, em uma única consulta de pesquisa. Isso permite que os usuários realizem pesquisas mais abrangentes e recuperem resultados mais relevantes. Por exemplo, uma pesquisa híbrida pode combinar embeddings de texto com embeddings de imagem para encontrar produtos que correspondam tanto a uma descrição textual quanto a um exemplo visual.
Para usar a pesquisa híbrida de forma eficaz no Milvus, é importante entender os diferentes campos vetoriais e como eles podem ser combinados. Ao selecionar e combinar cuidadosamente os campos vetoriais, os usuários podem melhorar a precisão e a relevância dos resultados de pesquisa. Além disso, usar estratégias de reranking pode ajudar a refinar ainda mais os resultados de pesquisa e garantir que os resultados mais relevantes sejam retornados.
Gerenciando Dados com Metadados
Os metadados desempenham um papel crucial no gerenciamento de dados no Milvus. Metadados são usados para descrever a estrutura e a organização dos dados, tornando mais fácil pesquisar, filtrar e analisar. No Milvus, os metadados são usados para gerenciar arquivos de dados, incluindo informações sobre os dados, como o nome da coleção, o campo vetorial e o tipo de índice.
Ao usar metadados de forma eficaz, os usuários podem melhorar o desempenho e a precisão de suas pesquisas. Os metadados permitem que os usuários organizem seus dados de uma forma que facilite a recuperação e a análise. Por exemplo, ao usar metadados para marcar dados com palavras-chave relevantes, os usuários podem filtrar e pesquisar rapidamente pontos de dados específicos.
Além de melhorar o desempenho da pesquisa, os metadados também podem ajudar a garantir a integridade e a consistência dos dados. Ao usar metadados para rastrear alterações e atualizações nos dados, os usuários podem garantir que seus dados permaneçam precisos e atualizados. Isso é particularmente importante em ambientes de dados em grande escala, nos quais os dados estão sendo constantemente atualizados e modificados.
JSON e Filtragem de Metadados
JSON (JavaScript Object Notation) é um formato de dados flexível amplamente usado em bancos de dados NoSQL e resultados de API. O Milvus oferece suporte ao upload e ao trabalho com dados JSON brutos, facilitando a integração com outros sistemas. A filtragem de metadados é um recurso poderoso no Milvus que permite aos usuários filtrar metadados JSON brutos com base em condições específicas.
Ao usar a filtragem de metadados, os usuários podem melhorar a precisão de suas buscas e reduzir a quantidade de dados irrelevantes. Por exemplo, os usuários podem filtrar dados JSON com base em campos ou valores específicos, como filtrar filmes por gênero ou ano de lançamento. Isso permite que os usuários realizem buscas mais direcionadas e recuperem resultados mais relevantes.
No Milvus, a filtragem de metadados pode ser usada em combinação com a busca vetorial para refinar ainda mais os resultados da busca. Ao aplicar filtros de metadados a consultas de busca vetorial, os usuários podem garantir que apenas os dados mais relevantes sejam retornados. Isso pode ajudar a melhorar a precisão da busca e reduzir a quantidade de dados irrelevantes que precisam ser processados.
Criação e gerenciamento de índices para busca vetorial
A criação de índices é uma etapa crítica na otimização do desempenho da busca vetorial no Milvus. Um índice é uma estrutura de dados que melhora a velocidade de recuperação de dados ao permitir que o banco de dados localize rapidamente dados específicos. No Milvus, índices podem ser criados em campos vetoriais para melhorar o desempenho das buscas vetoriais.
Existem diferentes tipos de índices disponíveis no Milvus, cada um com suas próprias vantagens e casos de uso. Por exemplo, o índice HNSW (Hierarchical Navigable Small World) é comumente usado para buscas vetoriais de alta dimensionalidade devido à sua eficiência e precisão. Outros tipos de índice, como IVF (Inverted File) e PQ (Product Quantization), oferecem diferentes compensações entre velocidade e precisão da busca.
Para criar e gerenciar índices de forma eficaz, é importante entender as características dos dados e os requisitos específicos de busca. Ao selecionar o tipo de índice apropriado e ajustar os parâmetros do índice, os usuários podem melhorar significativamente o desempenho de suas buscas. Além disso, atualizar e manter índices regularmente pode ajudar a garantir que o desempenho da busca permaneça ideal à medida que os dados evoluem.
Otimização do desempenho da busca híbrida
O desempenho da busca híbrida pode ser otimizado usando várias técnicas, incluindo criação de índices, filtragem de metadados e otimização de consultas. Ao criar índices em campos vetoriais, os usuários podem melhorar o desempenho das buscas vetoriais. Os índices permitem que o banco de dados localize rapidamente dados relevantes, reduzindo o tempo necessário para realizar buscas.
A filtragem de metadados é outra técnica importante para otimizar o desempenho da busca híbrida. Ao usar filtros de metadados, os usuários podem reduzir a quantidade de dados irrelevantes que precisam ser processados, melhorando a precisão e a velocidade da busca. Por exemplo, filtrar dados com base em campos ou valores específicos pode ajudar a restringir os resultados da busca e garantir que apenas os dados mais relevantes sejam retornados.
A otimização de consultas também é crucial para melhorar o desempenho da busca híbrida. Ao otimizar a estrutura e os parâmetros das consultas de busca, os usuários podem reduzir os recursos computacionais necessários para as buscas e melhorar o desempenho. Isso pode incluir técnicas como agrupamento de consultas em lotes, uso de estruturas de dados eficientes e ajuste de parâmetros de consulta.
Nesta seção, discutimos as melhores práticas para otimizar o desempenho da busca híbrida no Milvus. Ao usar técnicas como criação de índices, filtragem de metadados e otimização de consultas, os usuários podem melhorar a precisão e a velocidade de suas buscas, garantindo que recuperem os resultados mais relevantes.
Continue lendo

A Few Notes from Databricks Data + AI Summit 2026: Why the Data Layer Matters Again
James Luan shares notes from Databricks Data + AI Summit 2026 on why production AI is pushing the data layer back to the center of infrastructure.

Introducing Functions and Model Inference on Zilliz Cloud: Automatic Embedding and Reranking with Hosted Models
Zilliz Cloud Functions auto-generate embeddings via OpenAI, Voyage AI, Cohere, or Zilliz Hosted Models. Built-in reranking — just insert text and search.

Introducing Business Critical Plan: Enterprise-Grade Security and Compliance for Mission-Critical AI Applications
Discover Zilliz Cloud’s Business Critical Plan—offering advanced security, compliance, and uptime for mission-critical AI and vector database workloads.



