🚀 Novidades na filtragem de metadados no Milvus v2.4.3
Milvus v2.4.3 introduziu a correspondência de metadados de string completa! 🎉 Agora, você pode corresponder strings usando buscas por prefixo, infixo, sufixo ou até mesmo curinga de caractere.
# Exemplo de prefixo, corresponde a qualquer string que comece com “The”.
expression='title like "The%"'
# Exemplo de infixo, corresponde a qualquer string com a palavra “the” em qualquer lugar da frase.
expression='title like "%the%"'
# Exemplo de sufixo, corresponde a qualquer string que termine com “Rye”.
expression='title like "%Rye"'
# Exemplo de curinga de caractere único, corresponde a qualquer caractere único em uma posição específica.
expression='title like "Flip_ed"'
Em blogs anteriores, falamos apenas sobre correspondência de strings por prefixo. No entanto, desde o Milvus v2.4.3, todas as variações também são possíveis, assim como o uso de valores de array, seja por correspondências exatas ou verificando se algum elemento no array corresponde (contains_any()). 🗂️🔍
Essas atualizações tornam a filtragem de metadados mais versátil e poderosa!
Vamos tornar tudo isso mais claro com um exemplo. Usarei dados de filmes do IMDB para este blog, que baixei do Kaggle.
# Importe bibliotecas comuns.
import sys, os, time, pprint
import pandas as pd
# Leia os dados CSV.
df = pd.read_csv("data/original_data.csv")
# Reduza os dados para a demonstração.
df = df.tail(200)
display(df.head())
Cada filme tem um campo ‘text’ com sua descrição e avaliações. 📝
Cada filme inclui metadados como o ano de lançamento, classificação e listas de gêneros, atores e palavras-chave. 🎬⭐️📅
Cada “linha” representa um trecho de texto de avaliação de filme, sua representação vetorial e metadados como movie_id, título do filme, link do pôster, gêneros e atores.
Seguindo o padrão usual de RAG: 📝🎬
Conectar ao Milvus: Primeiro, conecte-se ao Milvus Lite, a implantação local do Milvus. Este é o nosso banco de dados para armazenar e gerenciar vetores. 🖥️🔗
Transformar Texto de Filme em Vetores: Pegue o campo de texto de cada filme, que inclui a descrição e a avaliação, e transforme-o em um vetor. Usaremos o modelo HuggingFace BAAI/bge-large-en-v1.5 para isso. 🧠➡️📏
📥📊 Inserir Vetores e Metadados no Milvus: Insira esse vetor, junto com o texto original (chamado de “chunk”) e seus metadados (como ano, classificação, gêneros etc.) no Milvus. 📥📊
Lidar com Consultas de Usuários: Transforme a consulta do usuário em um vetor usando o mesmo modelo de embedding. Em seguida, execute uma busca de Vizinhos Mais Próximos Aproximados para encontrar os vetores de dados mais próximos do vetor da consulta. 🔍🎬
Você pode encontrar o código completo no meu GitHub.
Primeiro, conecte-se ao Milvus. Você precisará instalar o Pymilvus com pip. (Ao especificar apenas um nome de arquivo local, ele usa o Milvus Lite, um banco de dados vetorial local. Se você tiver outro Milvus, como docker ou K8s implantado ou o Zilliz Cloud totalmente gerenciado, pode especificar o URI e o Token para se conectar a eles. O restante do código funciona da mesma forma.)
# !python -m pip install -U pymilvus
import pymilvus
# Conecte um cliente ao servidor Milvus Lite.
from pymilvus import MilvusClient
client = MilvusClient("milvus_demo.db")
Em seguida, divida em chunks e incorpore a coluna de texto que contém a avaliação do filme em vetores. Muitos recursos dão exemplos de como fazer isso, então não mostrarei o código novamente aqui. Abaixo, mostro como montar o texto dividido em chunks, a representação vetorial e os metadados, e inserir os dados no Milvus.
# Create chunk_list and dict_list in a single loop
dict_list = []
for id, title, chunk, vector, poster_url, director,\
genres, actors, keywords, film_year, rating in zip(
df.id, df.Name, chunks, converted_values, df.PosterLink,
df.Director, df.Genres, df.Actors, df.Keywords,
df.MovieYear, df.RatingValue):
# Assemble embedding vector, original text chunk, metadata.
chunk_dict = {
'movie_index': id,
'title': title,
'chunk': chunk.page_content,
'poster_url': poster_url,
'director': director,
'genres': genres,
'actors': actors,
'keywords': keywords,
'film_year': film_year,
'rating': rating,
'vector': vector,
}
dict_list.append(chunk_dict)
# Insert data into the Milvus collection.
print("Start inserting entities")
start_time = time.time()
client.insert(
COLLECTION_NAME,
data=dict_list,
progress_bar=True)
end_time = time.time()
print(f"Milvus insert time for {len(dict_list)} vectors: ", end="")
print(f"{np.round(end_time - start_time, 2)} seconds")
Agora que os dados estão no Milvus, estamos prontos para pesquisar!
Pesquisa Usando Filtros de Metadados de String
Digamos que queremos encontrar filmes de ficção científica que tenham um futuro distópico com robôs e sejam bem avaliados. Nossos dados de exemplo têm metadados que podemos usar para esta pesquisa.
Aqui está um exemplo de filtragem de metadados usando correspondências de string fuzzy. Abaixo, envolvi a API de pesquisa vanilla do Milvus apenas para exibir metadados mais facilmente após cada pesquisa.
SAMPLE_QUESTION = "Dystopia science fiction with a robot."
TOP_K = 1
# Metadata filters.
expression='rating >= 7'
# Infix string match.
expression=expression + ' && title like "%Panther%"'
formatted_results, contexts, context_metadata = \
mc_run_search(SAMPLE_QUESTION, expression, TOP_K)
Recursos e Leituras Adicionais
Guia de Início Rápido do Milvus
Use Campos de Array | Documentação do Milvus
https://github.com/milvus-io/pymilvus/blob/2.4/examples/fuzzy_match.py
https://milvus.io/docs/boolean.md#Usage
https://milvus.io/docs/single-vector-search.md#Filtered-search
Continue lendo

Zilliz Skills Breakdown: How AI Agents Master Vector Databases
Zilliz's Milvus Skill (pymilvus, 7 files) and Zilliz Cloud Skill (zilliz-cli, 14 modules) bring vector-DB dev and ops into one Claude Code session.

Zilliz Cloud Update: Tiered Storage, Business Critical Plan, Cross-Region Backup, and Pricing Changes
This release offers a rebuilt tiered storage with lower costs, a new Business Critical plan for enhanced security, and pricing updates, among other features.

Zilliz Cloud Delivers Better Performance and Lower Costs with Arm Neoverse-based AWS Graviton
Zilliz Cloud adopts Arm-based AWS Graviton3 CPUs to cut costs, speed up AI vector search, and power billion-scale RAG and semantic search workloads.



