Búsqueda por rango
Una búsqueda por rango mejora la relevancia de los resultados de búsqueda restringiendo la distancia o puntuación de las entidades devueltas dentro de un rango específico. Esta página le ayuda a entender qué es la búsqueda por rango y los procedimientos para realizar una búsqueda por rango.
Visión general
Cuando se ejecuta una solicitud de Búsqueda por rango, Milvus utiliza los vectores más similares al vector de consulta de los resultados de la Búsqueda RNA como centro, con el radio especificado en la solicitud de Búsqueda como radio del círculo exterior, y el filtro_rango como radio del círculo interior para dibujar dos círculos concéntricos. Se devolverán todos los vectores con puntuaciones de similitud que se encuentren dentro de la región anular formada por estos dos círculos concéntricos. Aquí, el filtro_rango puede fijarse en 0, lo que indica que se devolverán todas las entidades dentro de la puntuación de similitud especificada (radio).
Búsqueda por rango
El diagrama anterior muestra que una solicitud de búsqueda por rango contiene dos parámetros: radio y filtro_rango. Al recibir una solicitud de búsqueda por rango, Milvus hace lo siguiente.
Utiliza el tipo de métrica especificado(COSINE) para encontrar todas las incrustaciones vectoriales más similares al vector de consulta.
Filtra las incrustaciones vectoriales cuyas distancias o puntuaciones al vector de consulta se encuentran dentro del rango especificado por los parámetros radio y rango_filtro.
Devolver las entidades top-K a partir de las filtradas.
La forma de establecer radio y rango_filtro varía según el tipo de métrica de la búsqueda. La siguiente tabla enumera los requisitos para establecer estos dos parámetros con distintos tipos de métrica.
Tipo de métrica | Denotaciones | Requisitos para configurar radius y range_filter |
---|---|---|
| Una distancia L2 menor indica una mayor similitud. | Para ignorar las incrustaciones vectoriales más similares, asegúrese de que
|
| Una distancia IP mayor indica una mayor similitud. | Para ignorar las incrustaciones vectoriales más similares, asegúrese de que
|
| Una distancia COSINE mayor indica una mayor similitud. | Para ignorar las incrustaciones vectoriales más similares, asegúrese de que
|
| Una distancia Jaccard menor indica una mayor similitud. | Para ignorar las incrustaciones vectoriales más similares, asegúrese de que
|
| Una distancia Hamming menor indica una mayor similitud. | Para ignorar las incrustaciones vectoriales más similares, asegúrese de que
|
Ejemplos
Esta sección muestra cómo realizar una búsqueda de rango. Las solicitudes de búsqueda en los siguientes fragmentos de código no llevan un tipo métrico, lo que indica que se aplica el tipo métrico predeterminado COSINE. En este caso, asegúrese de que el valor de radio es menor que el valor de range_filter.
En los siguientes fragmentos de código, establezca radius
en 0.4
y range_filter
en 0.6
para que Milvus devuelva todas las entidades cuyas distancias o puntuaciones al vector de consulta estén comprendidas entre 0,4 y 0,6.
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
res = client.search(
collection_name="my_collection",
data=[query_vector],
limit=3,
search_params={
# highlight-start
"params": {
"radius": 0.4,
"range_filter": 0.6
}
# highlight-end
}
)
for hits in res:
print("TopK results:")
for hit in hits:
print(hit)
import io.milvus.v2.client.ConnectConfig;
import io.milvus.v2.client.MilvusClientV2;
io.milvus.v2.service.vector.request.SearchReq
import io.milvus.v2.service.vector.request.data.FloatVec;
import io.milvus.v2.service.vector.response.SearchResp
MilvusClientV2 client = new MilvusClientV2(ConnectConfig.builder()
.uri("http://localhost:19530")
.token("root:Milvus")
.build());
FloatVec queryVector = new FloatVec(new float[]{0.3580376395471989f, -0.6023495712049978f, 0.18414012509913835f, -0.26286205330961354f, 0.9029438446296592f});
Map<String,Object> extraParams = new HashMap<>();
extraParams.put("radius", 0.4);
extraParams.put("range_filter", 0.6);
SearchReq searchReq = SearchReq.builder()
.collectionName("range_search_collection")
.data(Collections.singletonList(queryVector))
.topK(5)
.searchParams(extraParams)
.build();
SearchResp searchResp = client.search(searchReq);
List<List<SearchResp.SearchResult>> searchResults = searchResp.getSearchResults();
for (List<SearchResp.SearchResult> results : searchResults) {
System.out.println("TopK results:");
for (SearchResp.SearchResult result : results) {
System.out.println(result);
}
}
// Output
// TopK results:
// SearchResp.SearchResult(entity={}, score=0.5975797, id=4)
// SearchResp.SearchResult(entity={}, score=0.46704385, id=5)
// TODO
import { MilvusClient, DataType } from "@zilliz/milvus2-sdk-node";
const address = "http://localhost:19530";
const token = "root:Milvus";
const client = new MilvusClient({address, token});
var query_vector = [0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
res = await client.search({
collection_name: "range_search_collection",
data: [query_vector],
limit: 5,
// highlight-start
params: {
"radius": 0.4,
"range_filter": 0.6
}
// highlight-end
})
export CLUSTER_ENDPOINT="http://localhost:19530"
export TOKEN="root:Milvus"
curl --request POST \
--url "${CLUSTER_ENDPOINT}/v2/vectordb/entities/search" \
--header "Authorization: Bearer ${TOKEN}" \
--header "Content-Type: application/json" \
-d '{
"collectionName": "quick_setup",
"data": [
[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
],
"annsField": "vector",
"filter": "color like \"red%\" and likes > 50",
"limit": 3,
"searchParams": {
"params": {
"radius": 0.4,
"range_filter": 0.6
}
}
}'
# {"code":0,"cost":0,"data":[]}