Bereichssuche
Eine Bereichssuche verbessert die Relevanz der Suchergebnisse, indem sie den Abstand oder die Punktzahl der zurückgegebenen Entitäten innerhalb eines bestimmten Bereichs einschränkt. Auf dieser Seite erfahren Sie, was eine Bereichssuche ist und wie Sie eine solche durchführen können.
Übersicht
Bei der Ausführung einer Bereichssuchanfrage verwendet Milvus die Vektoren mit der größten Ähnlichkeit zum Abfragevektor aus den ANN-Suchergebnissen als Zentrum, wobei der in der Suchanfrage angegebene Radius als äußerer Kreisradius und der range_filter als innerer Kreisradius verwendet wird, um zwei konzentrische Kreise zu zeichnen. Alle Vektoren mit Ähnlichkeitswerten, die in den von diesen beiden konzentrischen Kreisen gebildeten ringförmigen Bereich fallen, werden zurückgegeben. Hier kann der range_filter auf 0 gesetzt werden, was bedeutet, dass alle Entitäten innerhalb des angegebenen Ähnlichkeitswertes (Radius) zurückgegeben werden.
Bereichssuche
Das obige Diagramm zeigt, dass eine Anfrage zur Bereichssuche zwei Parameter enthält: radius und range_filter. Wenn Milvus eine Anfrage zur Bereichssuche erhält, tut es Folgendes.
Verwendung des angegebenen metrischen Typs(COSINE), um alle Vektoreinbettungen zu finden, die dem Abfragevektor am ähnlichsten sind.
Filterung der Vektoreinbettungen, deren Abstände oder Punktzahlen zum Abfragevektor innerhalb des durch die Parameter radius und range_filter angegebenen Bereichs liegen.
Rückgabe der Top-K Entitäten aus den gefilterten Entitäten.
Die Art und Weise, wie radius und range_filter gesetzt werden, variiert mit dem metrischen Typ der Suche. In der folgenden Tabelle sind die Anforderungen für die Einstellung dieser beiden Parameter bei verschiedenen metrischen Typen aufgeführt.
Metrischer Typ | Bezeichnungen | Voraussetzungen für die Einstellung von radius und range_filter |
---|---|---|
| Ein kleinerer L2-Abstand weist auf eine größere Ähnlichkeit hin. | Um die ähnlichsten Vektoreinbettungen zu ignorieren, muss sichergestellt werden, dass
|
| Ein größerer IP-Abstand weist auf eine höhere Ähnlichkeit hin. | Um die ähnlichsten Vektoreinbettungen zu ignorieren, stellen Sie sicher, dass
|
| Ein größerer COSINE-Abstand weist auf eine größere Ähnlichkeit hin. | Um die ähnlichsten Vektoreinbettungen zu ignorieren, stellen Sie sicher, dass
|
| Ein kleinerer Jaccard-Abstand weist auf eine größere Ähnlichkeit hin. | Um die ähnlichsten Vektoreinbettungen zu ignorieren, stellen Sie sicher, dass
|
| Ein kleinerer Hamming-Abstand weist auf eine größere Ähnlichkeit hin. | Um die ähnlichsten Vektoreinbettungen zu ignorieren, stellen Sie sicher, dass
|
Beispiele
Dieser Abschnitt zeigt, wie eine Bereichssuche durchgeführt wird. Die Suchanfragen in den folgenden Codeschnipseln enthalten keinen metrischen Typ, was bedeutet, dass der metrische Standardtyp COSINE verwendet wird. Stellen Sie in diesem Fall sicher, dass der Radius-Wert kleiner ist als der range_filter-Wert.
In den folgenden Codeschnipseln setzen Sie radius
auf 0.4
und range_filter
auf 0.6
, damit Milvus alle Entitäten zurückgibt, deren Abstände oder Punktzahlen zum Abfragevektor innerhalb von 0,4 bis 0,6 liegen.
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":[]}