🚀 Попробуйте Zilliz Cloud, полностью управляемый Milvus, бесплатно — ощутите 10-кратное увеличение производительности! Попробовать сейчас>

milvus-logo
LFAI
Главная
  • Руководство пользователя
  • Home
  • Docs
  • Руководство пользователя

  • Поиск и ранжирование

  • Поиск диапазона

Поиск по диапазону

Поиск по диапазону повышает релевантность результатов поиска, ограничивая расстояние или оценку возвращаемых сущностей определенным диапазоном. Эта страница поможет вам понять, что такое поиск по диапазону, а также процедуры для проведения поиска по диапазону.

Обзор

При выполнении запроса на поиск в диапазоне Milvus использует наиболее похожие на вектор запроса векторы из результатов поиска ANN в качестве центра, радиус, указанный в запросе на поиск, в качестве радиуса внешнего круга, а range_filter в качестве радиуса внутреннего круга, чтобы нарисовать две концентрические окружности. Будут возвращены все векторы с оценками сходства, которые попадают в кольцевую область, образованную этими двумя концентрическими окружностями. Здесь range_filter может быть установлен в 0, что означает, что будут возвращены все сущности в пределах указанного балла сходства (радиуса).

Range search Поиск по диапазону

На приведенной выше схеме видно, что запрос на поиск по диапазону содержит два параметра: радиус и range_filter. Получив запрос на поиск по диапазону, Milvus делает следующее.

  • Использует указанный тип метрики(COSINE) для поиска всех векторных вкраплений, наиболее похожих на вектор запроса.

  • Отфильтровать векторные вкрапления, чьи расстояния или оценки до вектора запроса попадают в диапазон, заданный параметрами radius и range_filter.

  • Вернуть топ-K сущностей из отфильтрованных.

Способ задания параметров radius и range_filter зависит от типа метрики поиска. В следующей таблице перечислены требования к настройке этих двух параметров для различных типов метрик.

Тип метрики

Обозначения

Требования к настройке radius и range_filter

L2

Меньшее расстояние L2 указывает на большее сходство.

Чтобы игнорировать наиболее похожие векторные вложения, убедитесь, что

range_filter <= расстояние < radius

IP

Большее расстояние IP указывает на большее сходство.

Чтобы игнорировать наиболее похожие векторные вложения, убедитесь, что

radius < расстояние <= range_filter

COSINE

Большее расстояние COSINE указывает на большее сходство.

Чтобы игнорировать наиболее похожие векторные вкрапления, убедитесь, что

radius < расстояние <= range_filter

JACCARD

Меньшее расстояние Жаккара указывает на большее сходство.

Чтобы игнорировать наиболее похожие векторные вкрапления, убедитесь, что

range_filter <= расстояние < radius

HAMMING

Меньшее расстояние Хэмминга указывает на большее сходство.

Чтобы игнорировать наиболее похожие векторные вкрапления, убедитесь, что

range_filter <= расстояние < radius

Примеры

В этом разделе показано, как выполнять поиск по диапазону. Поисковые запросы в следующих фрагментах кода не содержат метрического типа, что указывает на применение метрического типа по умолчанию 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":[]}

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?