🚀 Novedades del filtrado de metadatos en Milvus v2.4.3
Milvus v2.4.3 introdujo la coincidencia de metadatos de cadena completa. 🎉 Ahora puedes hacer coincidir cadenas usando búsquedas por prefijo, infijo, sufijo o incluso comodines de caracteres.
# Prefix example, matches any string starting with “The”.
expression='title like "The%"'
# Infix example, matches any string with the word “the” anywhere in the sentence.
expression='title like "%the%"'
# Postfix example, matches any string ending with “Rye”.
expression='title like "%Rye"'
# Single character wildcard example, matches any one single character at a specific position.
expression='title like "Flip_ed"'
En blogs anteriores, solo hablamos de la coincidencia de cadenas por prefijo. Sin embargo, desde Milvus v2.4.3, todas las variaciones también son posibles, así como el uso de valores de array, ya sea mediante coincidencias exactas o comprobando si algún elemento del array coincide (contains_any()). 🗂️🔍
¡Estas actualizaciones hacen que el filtrado de metadatos sea más versátil y potente!
Aclaremos todo esto con un ejemplo. Usaré datos de películas de IMDB para este blog, que descargué de Kaggle.
# Import common libraries.
import sys, os, time, pprint
import pandas as pd
# Read CSV data.
df = pd.read_csv("data/original_data.csv")
# Shortcut the data for demo.
df = df.tail(200)
display(df.head())
Cada película tiene un campo ‘text’ con su descripción y reseñas. 📝
Cada película incluye metadatos como el año de estreno, la calificación y listas de géneros, actores y palabras clave. 🎬⭐️📅
Cada “fila” representa un fragmento de texto de una reseña de película, su representación vectorial y metadatos como movie_id, título de la película, enlace del póster, géneros y actores.
Siguiendo el patrón habitual de RAG: 📝🎬
Conectarse a Milvus: Primero, conéctate a Milvus Lite, el despliegue local de Milvus. Esta es nuestra base de datos para almacenar y gestionar vectores. 🖥️🔗
Transformar el texto de películas en vectores: Toma el campo de texto de cada película, que incluye la descripción y la reseña, y transfórmalo en un vector. Usaremos el modelo de HuggingFace BAAI/bge-large-en-v1.5 para esto. 🧠➡️📏
📥📊 Insertar vectores y metadatos en Milvus: Inserta este vector, junto con el texto original (llamado el “fragmento”) y sus metadatos (como año, calificación, géneros, etc.) en Milvus. 📥📊
Gestionar consultas de usuarios: Transforma la consulta del usuario en un vector usando el mismo modelo de embeddings. Luego, ejecuta una búsqueda de Vecinos Más Cercanos Aproximados para encontrar los vectores de datos más cercanos al vector de la consulta. 🔍🎬
Puedes encontrar el código completo en mi GitHub.
Primero, conéctate a Milvus. Tendrás que instalar Pymilvus con pip. (Al especificar solo un nombre de archivo local, utiliza Milvus Lite, una base de datos vectorial local. Si tienes otro Milvus, como docker o K8s desplegado, o Zilliz Cloud completamente gestionado, puedes especificar el URI y el Token para conectarte a ellos. El resto del código funciona igual.)
# !python -m pip install -U pymilvus
import pymilvus
# Connect a client to the Milvus Lite server.
from pymilvus import MilvusClient
client = MilvusClient("milvus_demo.db")
A continuación, divide en fragmentos e incrusta en vectores la columna de texto que contiene la reseña de la película. Muchos recursos dan ejemplos de cómo hacerlo, así que no volveré a mostrar el código aquí. A continuación, muestro cómo ensamblar el texto fragmentado, la representación vectorial y los metadatos, e insertar los datos en 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")
Ahora que los datos están en Milvus, ¡estamos listos para buscar!
Búsqueda usando filtros de metadatos de cadena
Digamos que queremos encontrar películas de ciencia ficción que tengan un futuro distópico con robots y estén muy bien calificadas. Nuestros datos de ejemplo tienen metadatos que podemos usar para esta búsqueda.
Aquí hay un ejemplo de filtrado de metadatos usando coincidencias de cadena difusas. A continuación, he envuelto la API de búsqueda estándar de Milvus solo para mostrar los metadatos más fácilmente después de cada búsqueda.
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 y lecturas adicionales
Guía de inicio rápido de Milvus
Usar campos de array | Documentación de 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
Sigue leyendo

From Vector Database to Vector Lakebase
Zilliz offers a fully managed Vector Lakebase powered by Milvus, unifying real-time vector search, lake-scale discovery, and Al data operations.

Zilliz Cloud Introduces Advanced BYOC-I Solution for Ultimate Enterprise Data Sovereignty
Explore Zilliz Cloud BYOC-I, the solution that balances AI innovation with data control, enabling secure deployments in finance, healthcare, and education sectors.

DeepSeek Always Busy? Deploy It Locally with Milvus in Just 10 Minutes—No More Waiting!
Learn how to set up DeepSeek-R1 on your local machine using Ollama, AnythingLLM, and Milvus in just 10 minutes. Bypass busy servers and enhance AI responses with custom data.



