Поиск похожих векторов
Эта тема рассказывает о том, как выполнять поиск сущностей в 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)
}