Поиск похожих векторов

Эта тема рассказывает о том, как выполнять поиск сущностей в Milvus.

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

В следующем примере показано, как выполнить поиск похожих векторов в наборе данных из 2000 строк, состоящем из идентификаторов книг (первичный ключ), частоты слов (скалярное поле) и описаний книг (векторное поле). Это имитирует сценарий поиска конкретных книг на основе векторизованных описаний. Milvus вернет наиболее похожие результаты на основе вашего заданного вектора запроса и параметров поиска.

Загрузить коллекцию

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

err := milvusClient.LoadCollection(
  context.Background(),   // ctx
  "book",                 // CollectionName
  false                   // async
)
if err != nil {
  log.Fatal("не удалось загрузить коллекцию:", err.Error())
}

Подготовить параметры поиска

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

sp, _ := entity.NewIndexIvfFlatSearchParam( // Функция NewIndex*SearchParam
    10,                                  // searchParam
)

opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
    option.Limit = 3
    option.Offset = 0
    option.ConsistencyLevel = entity.ClStrong
    option.IgnoreGrowing = false
})
Параметр Описание Варианты
NewIndex*SearchParam func Функция для создания entity.SearchParam на основе различных типов индексов. Для вещественных векторов: - NewIndexFlatSearchParam() (FLAT) - NewIndexIvfFlatSearchParam(nprobe int) (IVF_FLAT) - NewIndexIvfSQ8SearchParam(nprobe int) (IVF_SQ8) - NewIndexIvfPQSearchParam(nprobe int) (RNSG) - NewIndexHNSWSearchParam(ef int) (HNSW) Для бинарных векторов: - NewIndexBinFlatSearchParam(nprobe int) (BIN_FLAT) - NewIndexBinIvfFlatSearchParam(nprobe int) (BIN_IVF_FLAT)
sp Специфические для индекса параметры поиска, возвращаемые предыдущей функцией. См. Индекс векторов для деталей.
opt Опции для ANN-поиска. - Limit: Указывает количество возвращаемых сущностей. - Offset: Указывает количество пропускаемых сущностей во время поиска. Сумма этого параметра и Limit должна быть меньше 16384. Например, если вы хотите запросить 9-е и 10-е ближайшие соседи вектора, установите Limit равным 2, а Offset равным 8. - ConsistencyLevel: Указывает уровень согласованности, применяемый во время поиска. - Ignore Growing: Указывает, следует ли игнорировать растущие сегменты в поиске похожести. Значение по умолчанию - False, указывает, что поиск включает растущие сегменты.

Выполнить поиск векторов

Выполните поиск векторов с помощью Milvus. Чтобы выполнить поиск в определенном разделе, укажите список имен разделов.

Milvus поддерживает установку уровня согласованности для поиска. В этом примере устанавливается уровень согласованности Strong. Вы также можете установить уровень согласованности Bounded, Session или Eventually. Более подробную информацию о четырех уровнях согласованности в Milvus см. в Руководстве по согласованности.

searchResult, err := milvusClient.Search(
    context.Background(),                    // ctx
    "book",                                  // CollectionName
    []string{},                              // partitionNames
    "",                                      // expr
    []string{"book_id"},                     // outputFields
    []entity.Vector{entity.FloatVector([]float32{0.1, 0.2})}, // vectors
    "book_intro",                            // vectorField
    entity.L2,                               // metricType
    10,                                      // topK
    sp,                                      // sp
    opt,
)
if err != nil {
    log.Fatal("Не удалось выполнить поиск в коллекции:", err.Error())
}
Параметр Описание Варианты
ctx Контекст, используемый для управления процессом вызова API N/Д
CollectionName Название коллекции для загрузки N/Д
partitionNames Список названий разделов для загрузки. Если пусто, выполняется поиск во всех разделах N/Д
expr Булевское выражение для фильтрации свойств См. Правила булевского выражения для подробной информации
output_fields Имена полей, которые должны быть возвращены N/Д
vectors Векторы для поиска N/Д
vectorField Имя поля для поиска N/Д
metricType Тип метрики, используемой для поиска Этот параметр должен быть таким же, как и тип метрики, используемый для построения индекса
topK Количество возвращаемых результатов. Сумма этого значения и offset в opts должна быть меньше 16384 N/Д
sp entity.SearchParam, специфический для индекса N/Д

Проверьте значения первичного ключа и расстояния до наиболее похожих векторов.

fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
    fmt.Println(sr.IDs)
    fmt.Println(sr.Scores)
}

После завершения поиска освободите коллекцию, загруженную в Milvus, чтобы снизить потребление памяти.

err := milvusClient.ReleaseCollection(
    context.Background(),                            // ctx
    "book",                                          // CollectionName
)
if err != nil {
    log.Fatal("Не удалось освободить коллекцию:", err.Error())
}

Ограничения

Возможность Максимальный предел
Длина названия коллекции 255 символов
Количество разделов в коллекции 4,096
Количество полей в коллекции 256
Количество разделов в коллекции 256
Размерность векторов 32,768
Топ K 16,384
Количество входных векторов 16,384

Выполнение смешанного поиска

Смешанный поиск по сути является поиском векторов с фильтрацией атрибутов. Указав булевское выражение для фильтрации скалярных полей или полей первичного ключа, вы можете ограничить поиск на основе конкретных условий.

Приведенный ниже пример демонстрирует, как выполнить смешанный поиск на основе обычного поиска векторов. Предположим, вы хотите найти конкретные книги на основе векторизованного введения книг, но хотите получить книги только в определенном диапазоне количества слов. Затем вы можете отфильтровать поле word_count, указав булевское выражение в параметрах поиска. Milvus будет искать только похожие векторы среди сущностей, которые соответствуют выражению.

sp, _ := entity.NewIndexFlatSearchParam(
  10,
)

opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
    option.Limit = 3
    option.Offset = 0
    option.ConsistencyLevel = entity.ClStrong
    option.IgnoreGrowing = false
})

searchResult, err := milvusClient.Search(
  context.Background(),
  "book",
  []string{},
  "word_count <= 11000",
  []string{"book_id"},
  []entity.Vector{entity.FloatVector([]float32{0.1, 0.2})},
  "book_intro",
  entity.L2,
  2,
  sp,
  opt,
)

if err != nil {
  log.Fatal("Не удалось выполнить поиск в коллекции:", err.Error())
}

Проверьте возвращаемые результаты.

fmt.Printf("%#v\n", searchResult)
for _, sr := range searchResult {
  fmt.Println(sr.IDs)
  fmt.Println(sr.Scores)
}