Поиск по диапазону
Поиск по диапазону повышает релевантность результатов поиска, ограничивая расстояние или оценку возвращаемых сущностей определенным диапазоном. Эта страница поможет вам понять, что такое поиск по диапазону, а также процедуры для проведения поиска по диапазону.
Обзор
При выполнении запроса на поиск в диапазоне 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={
# 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":[]}