Desbloquea motores de recomendación avanzados con la nueva búsqueda por rango de Milvus
Introducción
En la búsqueda por similitud, los desarrolladores a menudo necesitan ayuda con las limitaciones, particularmente al equilibrar la calidad y la diversidad de los resultados de búsqueda. Presentamos la nueva función de Milvus: Range Search. Esta publicación describirá qué es Range Search, cuándo usarla en lugar de la búsqueda Top-K tradicional, y profundizará en su arquitectura técnica y guía de uso.
¿Qué es Range Search?
Range Search en Milvus ofrece un control granular sobre la similitud vectorial en los resultados de búsqueda, lo que te permite especificar un rango de distancia para vectores relevantes. Esta función aborda las limitaciones de las búsquedas KNN tradicionales en sistemas de recomendación, donde los resultados pueden ser demasiado similares o demasiado diversos en comparación con tus expectativas.
¿Cuándo elegir la búsqueda por rango en lugar de la búsqueda Top-K?
La búsqueda KNN tradicional tiene dos deficiencias fundamentales:
Recomendaciones desequilibradas: Puede recomendar elementos demasiado similares, lo que afecta la calidad de las recomendaciones. Por ejemplo, un agregador de noticias deportivas podría terminar recomendando varios artículos sobre el mismo partido de fútbol a un usuario, simplemente porque leyó un artículo sobre el partido. Esto podría desplazar contenido diverso, haciendo que las recomendaciones se sientan repetitivas y menos atractivas.
Restricciones del sistema: El parámetro Top-K alcanza un máximo de 16,384, lo que plantea problemas para consultas de datos a gran escala y utilización de recursos. Considera un escenario en el que consultas un conjunto de datos de millones de productos. El límite Top-K de 16,384 significa que podrías perderte miles de productos relevantes que podrían ser de interés para el usuario, al mismo tiempo que se sobrecargan los recursos de tu sistema mientras intenta procesar y transmitir este gran volumen de datos.
Range Search resuelve estos problemas. Permite un conjunto equilibrado de resultados al permitirte definir un rango de distancia para la similitud vectorial. Agregar parámetros como radius y el range_filter opcional ofrece un control más matizado, eliminando la necesidad de filtrado posterior a la consulta. Este control matizado hace que Range Search sea ideal para aplicaciones que requieren un control preciso sobre los resultados de búsqueda.
Detalles técnicos detrás de Range Search
Ahora que hemos explorado qué es Range Search y cuándo usarla, profundicemos en su arquitectura y algoritmos. Esta exploración proporcionará información crítica sobre sus fortalezas, limitaciones e integración con bibliotecas de terceros.
El flujo de Range Search se basa en el flujo de Search existente, reutilizando la mayoría de las rutas de datos en los niveles superiores. A continuación se presenta un esquema de los pasos que se realizan cuando se recibe una solicitud de búsqueda:
El SDK gestiona la solicitud de búsqueda: El SDK recibe una solicitud de búsqueda de usuario que contiene parámetros como radius y range_filter.
El proxy genera SearchTask: Al recibir la solicitud de búsqueda, el proxy crea una SearchTask y la pasa al nodo de consulta.
Querynode a Segcore: El nodo de consulta invoca la interfaz Search en Segcore mediante una llamada cgo.
Análisis de Segcore: Segcore analiza los parámetros en search_param. Si hay un parámetro radius presente, invoca knowhere::RangeSearch.
Knowhere y bibliotecas de terceros: Knowhere (el motor principal de ejecución vectorial de Milvus) enruta entonces la llamada a la función range_search de la biblioteca de terceros correspondiente según el tipo de índice.
Todos los índices de bibliotecas de terceros que admitimos están configurados para realizar Range Search unilateral. "Unilateral" significa que solo aceptan un único parámetro 'radius' y devuelven todos los resultados no ordenados dentro de ese radio. La tabla siguiente describe las estrategias de Range Search para diferentes tipos de índice.
| Tipo de índice | Estrategia de búsqueda |
|---|---|
| IDMAP / BIN_IDMAP | Búsqueda por fuerza bruta |
| IVF_xxx / SCANN / BIN_IVF_xxx (actualizado) | Comienza buscando desde el bucket más cercano al punto central. Detén la búsqueda cuando se cumpla una de las siguientes condiciones: 1. Se han buscado todos los buckets 2. No se encuentran vectores que cumplan la condición en un bucket. |
| HNSW (desarrollado internamente) | Comienza la búsqueda desde la capa superior e identifica el vector más cercano al objetivo; luego, continúa con la siguiente capa inferior. Continúa este proceso capa por capa hasta que llegue al vecino más cercano en la capa inferior (1.ª). Desde allí, realiza una búsqueda en anchura (BFS) comenzando desde este vecino más cercano y continuando hasta que todos los puntos visitados y sus vecinos salientes queden fuera del rango deseado. |
| DISKANN | Comienza con l_search = min_l_search. Para cada iteración, establece l_search = 2 * l_search. Detén la búsqueda cuando se cumpla una de las siguientes condiciones: 1. El número de resultados devueltos en una iteración es menor que l_search / 2 2. l_search > max_l_search. |
Tanto los tipos de métrica HAMMING como JACCARD ofrecen compatibilidad total con la búsqueda por rango para tipos de datos binarios. Sin embargo, los tipos de métrica SUBSTRUCTURE/SUPERSTRUCTURE son incompatibles con la búsqueda por rango, ya que su semántica se basa en un sistema de valores verdadero/falso. En cuanto a los índices de tipo float, aquellos que utilizan las métricas L2, IP y COSINE son totalmente compatibles con la búsqueda por rango.
La tabla siguiente describe los tipos de índice y métrica detallados compatibles con la búsqueda por rango.
| L2 | IP | COSINE | HAMMING | JACCARD | SUBSTRUCTURE | SUPERSTRUCTURE | |
|---|---|---|---|---|---|---|---|
| BIN_IDMAP | √ | √ | |||||
| BIN_IVF_FLAT | √ | √ | |||||
| IDMAP | √ | √ | √ | ||||
| IVF_FLAT | √ | √ | √ | ||||
| IVF_PQ | √ | √ | √ | ||||
| IVF_SQ8 | √ | √ | √ | ||||
| HNSW | √ | √ | √ | √ | √ | ||
| SCANN | √ | √ | √ | ||||
| DISKANN | √ | √ | √ |
Cómo usar Range Search en Milvus
Para usar Range Search en Milvus, deberás modificar los parámetros de búsqueda en tu solicitud de búsqueda. Aquí tienes una guía paso a paso, que incluye un fragmento de código de ejemplo en Python:
Requisitos previos
Asegúrate de que Milvus esté instalado y en ejecución.
Asegúrate de haber creado una colección y de haberla indexado.
Parámetros importantes de Range Search
radius: Este es un parámetro obligatorio que determina si la solicitud de búsqueda realizará una búsqueda por rango o una búsqueda normal.
range_filter: Este es un parámetro opcional. Si se proporciona, realizará un filtrado secundario sobre los resultados. Si no se especifica, la función devolverá los resultados directamente.
Al configurar estos dos parámetros, puedes ajustar con precisión el comportamiento de tus consultas de Range Search para diferentes necesidades de aplicación. Con esto en mente, veamos algo de código de ejemplo para ayudarte a empezar.
default_index = {
"index_type": "HNSW",
"metric_type": "L2",
"params": {"M":48,"efConstruction":500}
}
collection.create_index("float_vector", default_index)
search_params = {
"metric_type": "L2",
"limit": TOPK,
"params": {"ef":32,"range_filter":1.0,"radius":2.0}
}
res = collection.search(vectors[:nq], "float_vector", search_params, limit)
Consideraciones sobre métricas
Ahora que entiendes cómo usar Range Search, es esencial considerar el impacto de los tipos de métrica en tus consultas. Dependiendo del tipo de métrica que elijas, deberías comprobar el Radius como sugerimos en la tabla siguiente.
| Tipo de métrica | Radius | Similar | No similar |
|---|---|---|---|
| L2 | [0.0, inf] | 0.0 | inf |
| IP | [-inf, inf] | inf | -inf |
| COSINE | [-1.0, 1.0] | 1.0 | -1.0 |
| HAMMING | [0, n] | 0 | n |
| JACCARD | [0.0, 1.0] | 0.0 | 1.0 |
Además, range_filter debe seguir estas reglas:
Para L2/Hamming/Jaccard, range_filter < radius
Para IP/Cosine, range_filter > radius
Conclusión
Range Search en Milvus no se limita a motores de recomendación; tiene aplicaciones más amplias en áreas como la coincidencia de contenido, la detección de anomalías y las tareas de búsqueda de NLP. Al aprovechar parámetros como radius y range_filter, puedes adaptar con precisión tus consultas para que se ajusten a estos diversos casos de uso.
¿Listo para tomar el control de tus solicitudes de búsqueda? Range Search ya está disponible como vista previa pública en Zilliz Cloud. Actualiza a la versión beta de Zilliz Cloud o descarga Milvus 2.3.x para probarlo. Tus comentarios son clave para su mejora continua, así que si encuentras algún problema o tienes sugerencias, estamos atentos. Mejoremos Range Search juntos.
Sigue leyendo

Zilliz Cloud Now Available in AWS Asia Pacific (Seoul)
Zilliz Cloud is now available in AWS Seoul — low-latency vector search, in-country data residency, and one-step migration for Korean AI teams. 31 regions across 5 clouds.

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.

How to Use Anthropic MCP Server with Milvus
MCP + Milvus: Streamline AI agent development with standardized data access, eliminating integration hassles while enhancing context and flexibility.



