Поиск по диапазону
Поиск по диапазону повышает релевантность результатов поиска, ограничивая расстояние или оценку возвращаемых сущностей определенным диапазоном. Эта страница поможет вам понять, что такое поиск по диапазону, а также процедуры для проведения поиска по диапазону.
Обзор
При выполнении запроса на поиск в диапазоне Milvus использует наиболее похожие на вектор запроса векторы из результатов поиска ANN в качестве центра, радиус, указанный в запросе на поиск, в качестве радиуса внешнего круга, а range_filter в качестве радиуса внутреннего круга, чтобы нарисовать две концентрические окружности. Будут возвращены все векторы с оценками сходства, которые попадают в кольцевую область, образованную этими двумя концентрическими окружностями. Здесь range_filter может быть установлен в 0, что означает, что будут возвращены все сущности в пределах указанного балла сходства (радиуса).
Поиск по диапазону
На приведенной выше диаграмме видно, что запрос на поиск по диапазону содержит два параметра: радиус и range_filter. Получив запрос на поиск диапазона, Milvus делает следующее:
Использует указанный тип метрики(COSINE) для поиска всех векторных вкраплений, наиболее похожих на вектор запроса.
Отфильтровать векторные вкрапления, чьи расстояния или оценки до вектора запроса попадают в диапазон, заданный параметрами radius и range_filter.
Вернуть топ-K сущностей из отфильтрованных.
Способ задания параметров radius и range_filter зависит от типа метрики поиска. В следующей таблице перечислены требования к настройке этих двух параметров для различных типов метрик.
Тип метрики |
Обозначения |
Требования к настройке параметров radius и range_filter |
|---|---|---|
|
Меньшее расстояние L2 указывает на большее сходство. |
Чтобы игнорировать наиболее похожие векторные вложения, убедитесь, что
|
|
Большее расстояние IP указывает на большее сходство. |
Чтобы игнорировать наиболее похожие векторные вложения, убедитесь, что
|
|
Большее расстояние COSINE указывает на большее сходство. |
Чтобы проигнорировать наиболее похожие векторные вложения, убедитесь, что
|
|
Меньшее расстояние Жаккара указывает на большее сходство. |
Чтобы игнорировать наиболее похожие векторные вложения, убедитесь, что
|
|
Меньшее расстояние Хэмминга указывает на большее сходство. |
Чтобы игнорировать наиболее похожие векторные вложения, убедитесь, что
|
Примеры
Этот раздел демонстрирует, как выполнять поиск по диапазону. Поисковые запросы в следующих фрагментах кода не содержат метрического типа, что указывает на применение метрического типа по умолчанию COSINE. В этом случае убедитесь, что значение радиуса меньше значения range_filter.
В следующих фрагментах кода установите radius на 0.4 и range_filter на 0.6, чтобы Milvus вернул все сущности, чьи расстояния или баллы до вектора запроса находятся в пределах от 0,4 до 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={
"params": {
"radius": 0.4,
"range_filter": 0.6
}
}
)
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("my_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)
import (
"context"
"fmt"
"github.com/milvus-io/milvus/client/v2/index"
"github.com/milvus-io/milvus/client/v2/entity"
"github.com/milvus-io/milvus/client/v2/milvusclient"
)
ctx, cancel := context.WithCancel(context.Background())
defer cancel()
milvusAddr := "localhost:19530"
client, err := milvusclient.New(ctx, &milvusclient.ClientConfig{
Address: milvusAddr,
})
if err != nil {
fmt.Println(err.Error())
// handle error
}
defer client.Close(ctx)
queryVector := []float32{0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592}
annParam := index.NewCustomAnnParam()
annParam.WithRadius(0.4)
annParam.WithRangeFilter(0.6)
resultSets, err := client.Search(ctx, milvusclient.NewSearchOption(
"my_collection", // collectionName
5, // limit
[]entity.Vector{entity.FloatVector(queryVector)},
).WithConsistencyLevel(entity.ClStrong).
WithANNSField("vector").
WithAnnParam(annParam))
if err != nil {
fmt.Println(err.Error())
// handle error
}
for _, resultSet := range resultSets {
fmt.Println("IDs: ", resultSet.IDs.FieldData().GetScalars())
fmt.Println("Scores: ", resultSet.Scores)
}
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: "my_collection",
data: [query_vector],
limit: 5,
params: {
"radius": 0.4,
"range_filter": 0.6
}
})
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" \
--header "Request-Timeout: 10" \
-d '{
"collectionName": "my_collection",
"data": [
[0.3580376395471989, -0.6023495712049978, 0.18414012509913835, -0.26286205330961354, 0.9029438446296592]
],
"annsField": "vector",
"limit": 5,
"searchParams": {
"params": {
"radius": 0.4,
"range_filter": 0.6
}
}
}'
# {"code":0,"cost":0,"data":[]}
Если векторы запросов уже существуют в целевой коллекции, используйте ids вместо того, чтобы извлекать их перед поиском. Подробнее см. в разделе Первично-ключевой поиск.