Filtrado de metadatos en Milvus: filtrado JSON y de metadatos en Milvus
JSON, o JavaScript Object Notation, es un formato de datos flexible para almacenamiento y transmisión. Utiliza pares clave-valor de forma adaptativa, lo que lo hace perfecto para bases de datos NoSQL y resultados de API. Debido a su flexibilidad, es un formato de datos popular. Los parámetros de búsqueda son cruciales para definir los detalles específicos de cada solicitud de búsqueda, como los campos vectoriales utilizados, los vectores de consulta y los límites en el número de resultados devueltos.
Muchas demostraciones de Milvus comienzan con datos de texto sin procesar, como tipos de archivo .txt, .pdf o .csv. Pero ¿sabías que puedes cargar y trabajar con JSON sin procesar con Milvus? Consulta esta página de documentación de JSON para obtener más detalles.
Milvus Client es un contenedor alrededor del objeto de colección de Milvus que utiliza un formato JSON flexible “key”:value para permitir definiciones de datos sin esquema. Consulta la documentación de Milvus Client para obtener más información.
¡Milvus Client sin esquema y el nivel gratuito en la nube de Zilliz son una excelente manera de usar Milvus rápidamente! Milvus Client es casi tan rápido como definir un esquema completo por adelantado, pero con una codificación menos propensa a errores. En comparación con “enable_dynamic_field”, Milvus Client es mucho más rápido y ofrece un enfoque más fluido para usar menos definición de esquema por adelantado. El esquema sin esquema es:
- id (str): Nombre del campo de clave primaria.
- vector (str): Nombre del campo vectorial.
¡Eso es todo! El resto de los campos se pueden determinar de forma flexible cuando los datos se insertan en Milvus.
Para hacer esto más concreto, veamos algunos ejemplos de código sobre cómo usar Milvus Client. El código completo está en mi repositorio de Bootcamp en github.
Ejemplo de código: cargar datos JSON sin procesar directamente en Milvus
Los datos sin procesar en sí podrían estar en formato JSON. Esto es útil, por ejemplo, si tus datos provienen de una base de datos NoSQL como MongoDB. A continuación, los datos JSON utilizados son la clasificación de géneros de películas de IMDB de 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))
Inicia un servidor de prueba gratuita en la nube de Zilliz. Puedes tener hasta 2 colecciones, cada una de hasta 1 millón de vectores, en una prueba gratuita a la vez. El código de este cuaderno utiliza fully-man
- Elige la opción predeterminada "Starter" cuando aprovisiones > Create collection > Give it a name > Create cluster and collection.
- En la página principal del clúster, copia tu
API Keyy guárdala localmente en una variable .env ‘ZILLIZ_API_KEY’. - También en la página principal del clúster, copia el
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()}")
Elige un modelo de embedding. A continuación, he elegido uno de HuggingFace. Estoy ejecutando esto en mi portátil, así que tengo que asegurarme de 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')
# Cargar el modelo desde el hub de modelos de huggingface.
model_name = "WhereIsAI/UAE-Large-V1"
encoder = SentenceTransformer(model_name, device=DEVICE)
# Obtener los parámetros del modelo y guardarlos para más tarde.
EMBEDDING_DIM = encoder.get_sentence_embedding_dimension()
MAX_SEQ_LENGTH_IN_TOKENS = encoder.get_max_seq_length()
# Ver los parámetros del modelo.
print(f"model_name: {model_name}")
print(f"EMBEDDING_DIM: {EMBEDDING_DIM}")
print(f"MAX_SEQ_LENGTH: {MAX_SEQ_LENGTH}")
Importa MilvusClient y crea la colección. ¡Observa que no tenemos que especificar un esquema! Además, puedes usar simplemente nuestro índice predeterminado del sistema, llamado AUTOINDEX. En código abierto y en el nivel gratuito, el predeterminado es HNSW. En Zilliz cloud de pago, AUTOINDEX se optimizará aún más mediante índices propietarios.
from pymilvus import MilvusClient
import pprint
# Establecer el nombre de la colección de Milvus.
COLLECTION_NAME = "imdb_metadata"
# Usar el cliente de Milvus sin esquema.
mc = MilvusClient(
uri=CLUSTER_ENDPOINT,
token=TOKEN)
# Comprobar si la colección ya existe; si es así, eliminarla.
has = utility.has_collection(COLLECTION_NAME)
if has:
drop_result = utility.drop_collection(COLLECTION_NAME)
print(f"Successfully dropped collection: `{COLLECTION_NAME}`")
# Crear la colección.
mc.create_collection(COLLECTION_NAME,
EMBEDDING_DIM,
consistency_level="Eventually",
auto_id=True,
overwrite=True,
# omitir la configuración de params, si se usa AUTOINDEX
)
print(f"Successfully created collection: `{COLLECTION_NAME}`")
pprint.pprint(mc.describe_collection(COLLECTION_NAME))
Una estrategia simple de fragmentación es mantener el campo ‘text’ como un solo fragmento, a menos que supere los 512 caracteres de longitud. A continuación, podemos ver que el campo de texto de los datos JSON era bastante corto. No hubo que dividir ninguna fila en fragmentos más pequeños.
# Usar los parámetros del modelo de embeddings.
chunk_size = 512
chunk_overlap = np.round(chunk_size * 0.10, 0)
# Fragmentar un lote de datos desde pandas DataFrame e inspeccionarlo.
BATCH_SIZE = 100
batch = imdb_chunk_text(BATCH_SIZE, df, chunk_size)
display(batch.head(2))
Ahora que tenemos fragmentos de texto, embeddings vectoriales para cada fragmento de texto y todos los metadatos originales, insertemos esos datos en la base de datos vectorial Milvus.
# Convertir el DataFrame en una lista de diccionarios
chunk_list = batch.to_dict(orient='records')
# Insertar datos en la colección de Milvus.
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")
Hagamos una pregunta y recuperemos respuestas de nuestros datos de películas.
SAMPLE_QUESTION = "Dystopia science fiction with a robot."
# Incrustar la pregunta usando el mismo encoder.
query_embeddings = _utils.embed_query(encoder, [SAMPLE_QUESTION])
TOP_K = 2
# Ejecutar búsqueda vectorial semántica usando tu consulta y la base de datos vectorial.
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")
tiempo de búsqueda
Al recorrer los 2 resultados principales, vemos.
Eso se ve bastante bien. ¿Pero qué pasa si queremos hacer algún filtrado de metadatos en el array JSON ‘Genres’?
Filtrado de metadatos en campos JSON y arrays JSON
Una nueva función en Milvus 2.3 es la capacidad de filtrar metadatos JSON sin procesar. A continuación, mostraré un ejemplo usando filtrado de metadatos con un campo y un array.
Supongamos que quisiera ver películas más antiguas, más retro y estrictamente del 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")
Al recorrer los 2 resultados principales, ahora las recomendaciones de películas han cambiado para coincidir con el filtro.
Muchas demos de Milvus comienzan con datos de texto sin procesar, como tipos de archivo .txt, .pdf o .csv. Esta vez vimos cómo cargar datos JSON directamente en una colección de base de datos vectorial de Milvus. También vimos cómo usar el práctico filtrado de metadatos en campos JSON y el filtrado json_contains() en tipos de datos de array JSON. El código completo de este artículo de blog está en mi repo de GitHub de Bootcamp.
Introducción a la búsqueda híbrida
La búsqueda híbrida es una función potente en Milvus que permite a los usuarios combinar múltiples campos vectoriales en una sola búsqueda. Esta función es particularmente útil en escenarios de búsqueda complejos donde una entidad puede estar representada por múltiples vectores diversos. Al integrar los resultados de múltiples búsquedas vectoriales usando estrategias de reranking, la búsqueda híbrida permite a los usuarios lograr mayor precisión y resultados más relevantes.
En Milvus, la búsqueda híbrida se puede usar para combinar diferentes tipos de datos, como texto, imágenes y audio, en una sola consulta de búsqueda. Esto permite a los usuarios realizar búsquedas más completas y recuperar resultados más relevantes. Por ejemplo, una búsqueda híbrida puede combinar embeddings de texto con embeddings de imágenes para encontrar productos que coincidan tanto con una descripción textual como con un ejemplo visual.
Para usar la búsqueda híbrida de manera efectiva en Milvus, es importante comprender los diferentes campos vectoriales y cómo se pueden combinar. Al seleccionar y combinar cuidadosamente los campos vectoriales, los usuarios pueden mejorar la precisión y la relevancia de sus resultados de búsqueda. Además, usar estrategias de reranking puede ayudar a refinar aún más los resultados de búsqueda y garantizar que se devuelvan los resultados más relevantes.
Gestión de datos con metadatos
Los metadatos desempeñan un papel crucial en la gestión de datos en Milvus. Los metadatos se utilizan para describir la estructura y organización de los datos, lo que facilita la búsqueda, el filtrado y el análisis. En Milvus, los metadatos se utilizan para gestionar archivos de datos, incluida información sobre los datos, como el nombre de la colección, el campo vectorial y el tipo de índice.
Al usar metadatos de manera efectiva, los usuarios pueden mejorar el rendimiento y la precisión de sus búsquedas. Los metadatos permiten a los usuarios organizar sus datos de una manera que facilita recuperarlos y analizarlos. Por ejemplo, al usar metadatos para etiquetar datos con palabras clave relevantes, los usuarios pueden filtrar y buscar rápidamente puntos de datos específicos.
Además de mejorar el rendimiento de búsqueda, los metadatos también pueden ayudar a garantizar la integridad y coherencia de los datos. Al usar metadatos para rastrear cambios y actualizaciones en los datos, los usuarios pueden garantizar que sus datos permanezcan precisos y actualizados. Esto es particularmente importante en entornos de datos a gran escala donde los datos se actualizan y modifican constantemente.
JSON y filtrado de metadatos
JSON (JavaScript Object Notation) es un formato de datos flexible que se utiliza ampliamente en bases de datos NoSQL y resultados de API. Milvus admite la carga y el trabajo con datos JSON sin procesar, lo que facilita la integración con otros sistemas. El filtrado de metadatos es una función potente en Milvus que permite a los usuarios filtrar metadatos JSON sin procesar según condiciones específicas.
Al utilizar el filtrado de metadatos, los usuarios pueden mejorar la precisión de sus búsquedas y reducir la cantidad de datos irrelevantes. Por ejemplo, los usuarios pueden filtrar datos JSON según campos o valores específicos, como filtrar películas por género o año de estreno. Esto permite a los usuarios realizar búsquedas más dirigidas y recuperar resultados más relevantes.
En Milvus, el filtrado de metadatos puede utilizarse en combinación con la búsqueda vectorial para refinar aún más los resultados de búsqueda. Al aplicar filtros de metadatos a consultas de búsqueda vectorial, los usuarios pueden asegurarse de que solo se devuelvan los datos más relevantes. Esto puede ayudar a mejorar la precisión de la búsqueda y reducir la cantidad de datos irrelevantes que deben procesarse.
Creación y gestión de índices para la búsqueda vectorial
La creación de índices es un paso fundamental para optimizar el rendimiento de la búsqueda vectorial en Milvus. Un índice es una estructura de datos que mejora la velocidad de recuperación de datos al permitir que la base de datos localice rápidamente datos específicos. En Milvus, los índices pueden crearse en campos vectoriales para mejorar el rendimiento de las búsquedas vectoriales.
Hay diferentes tipos de índices disponibles en Milvus, cada uno con sus propias ventajas y casos de uso. Por ejemplo, el índice HNSW (Hierarchical Navigable Small World) se utiliza comúnmente para búsquedas vectoriales de alta dimensionalidad debido a su eficiencia y precisión. Otros tipos de índices, como IVF (Inverted File) y PQ (Product Quantization), ofrecen diferentes compensaciones entre velocidad de búsqueda y precisión.
Para crear y gestionar índices de manera eficaz, es importante comprender las características de los datos y los requisitos específicos de búsqueda. Al seleccionar el tipo de índice adecuado y ajustar los parámetros del índice, los usuarios pueden mejorar significativamente el rendimiento de sus búsquedas. Además, actualizar y mantener regularmente los índices puede ayudar a garantizar que el rendimiento de la búsqueda siga siendo óptimo a medida que los datos evolucionan.
Optimización del rendimiento de la búsqueda híbrida
El rendimiento de la búsqueda híbrida puede optimizarse mediante el uso de diversas técnicas, incluida la creación de índices, el filtrado de metadatos y la optimización de consultas. Al crear índices en campos vectoriales, los usuarios pueden mejorar el rendimiento de las búsquedas vectoriales. Los índices permiten que la base de datos localice rápidamente datos relevantes, reduciendo el tiempo necesario para realizar búsquedas.
El filtrado de metadatos es otra técnica importante para optimizar el rendimiento de la búsqueda híbrida. Al utilizar filtros de metadatos, los usuarios pueden reducir la cantidad de datos irrelevantes que deben procesarse, mejorando la precisión y la velocidad de la búsqueda. Por ejemplo, filtrar datos según campos o valores específicos puede ayudar a acotar los resultados de búsqueda y garantizar que solo se devuelvan los datos más relevantes.
La optimización de consultas también es crucial para mejorar el rendimiento de la búsqueda híbrida. Al optimizar la estructura y los parámetros de las consultas de búsqueda, los usuarios pueden reducir los recursos computacionales necesarios para las búsquedas y mejorar el rendimiento. Esto puede incluir técnicas como agrupar consultas en lotes, utilizar estructuras de datos eficientes y ajustar los parámetros de consulta.
En esta sección, hemos analizado las mejores prácticas para optimizar el rendimiento de la búsqueda híbrida en Milvus. Al utilizar técnicas como la creación de índices, el filtrado de metadatos y la optimización de consultas, los usuarios pueden mejorar la precisión y la velocidad de sus búsquedas, asegurándose de recuperar los resultados más relevantes.
Sigue leyendo

Zilliz Cloud BYOC Now Available Across AWS, GCP, and Azure
Zilliz Cloud BYOC is now generally available on all three major clouds. Deploy fully managed vector search in your own AWS, GCP, or Azure account — your data never leaves your VPC.

Why I’m Against Claude Code’s Grep-Only Retrieval? It Just Burns Too Many Tokens
Learn how vector-based code retrieval cuts Claude Code token consumption by 40%. Open-source solution with easy MCP integration. Try claude-context today.

Data Deduplication at Trillion Scale: How to Solve the Biggest Bottleneck of LLM Training
Explore how MinHash LSH and Milvus handle data deduplication at the trillion-scale level, solving key bottlenecks in LLM training for improved AI model performance.



