milvus-logo
LFAI
Home
  • Benutzerhandbuch

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.

Range search 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

L2

Ein kleinerer L2-Abstand weist auf eine größere Ähnlichkeit hin.

Um die ähnlichsten Vektoreinbettungen zu ignorieren, muss sichergestellt werden, dass

range_filter <= Abstand < radius

IP

Ein größerer IP-Abstand weist auf eine höhere Ähnlichkeit hin.

Um die ähnlichsten Vektoreinbettungen zu ignorieren, stellen Sie sicher, dass

radius < Abstand <= range_filter

COSINE

Ein größerer COSINE-Abstand weist auf eine größere Ähnlichkeit hin.

Um die ähnlichsten Vektoreinbettungen zu ignorieren, stellen Sie sicher, dass

radius < Abstand <= range_filter

JACCARD

Ein kleinerer Jaccard-Abstand weist auf eine größere Ähnlichkeit hin.

Um die ähnlichsten Vektoreinbettungen zu ignorieren, stellen Sie sicher, dass

range_filter <= Abstand < radius

HAMMING

Ein kleinerer Hamming-Abstand weist auf eine größere Ähnlichkeit hin.

Um die ähnlichsten Vektoreinbettungen zu ignorieren, stellen Sie sicher, dass

range_filter <= Abstand < radius

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":[]}

Übersetzt vonDeepL

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

War diese Seite hilfreich?