Выполнение условных запросов
Эта тема представляет введение в выполнение условных запросов, аналогичных условиям WHERE в SQL.
В отличие от поиска похожих векторов, запросы извлекают вектора на основе скалярных фильтров с использованием булевых выражений. Milvus поддерживает различные типы данных в скалярных полях и разнообразные булевы выражения. Булевы выражения могут фильтровать скалярные поля или поля первичных ключей и извлекать все результаты, соответствующие условиям фильтра.
Ниже приведен пример выполнения запроса к набору данных, содержащему 2000 строк, включая идентификатор книги (первичный ключ), количество слов (скалярное поле) и введение книги (векторное поле). Он демонстрирует имитацию запроса конкретных книг на основе их идентификаторов.
Загрузка коллекции
В Milvus все операции поиска и запросов выполняются в памяти. Прежде чем выполнять запрос, коллекцию необходимо загрузить в память.
err := milvusClient.LoadCollection(
context.Background(), // ctx
"book", // Наименование коллекции
false // Асинхронно
)
if err != nil {
log.Fatal("Ошибка загрузки коллекции:", err.Error())
}
Выполнение запроса
Ниже приведен пример фильтрации векторов на основе конкретных значений book_id
и возврата полей book_id
и book_intro
результата.
Milvus поддерживает установку уровней консистентности для запросов. В данном примере устанавливается уровень консистентности Strong
. Также можно установить уровень консистентности Bounded
, Session
или Eventually
. Для получения дополнительной информации о четырех уровнях консистентности в Milvus обратитесь к Consistency.
Также можно использовать динамические поля в выражениях фильтра и выходные поля в запросе. Например, см. динамический образец.
opt := client.SearchQueryOptionFunc(func(option *client.SearchQueryOption) {
option.Limit = 3
option.Offset = 0
option.ConsistencyLevel = entity.ClStrong
option.IgnoreGrowing = false
})
queryResult, err := milvusClient.Query(
context.Background(), // ctx
"book", // Наименование коллекции
"", // Наименование раздела
entity.NewColumnInt64("book_id", []int64{2,4,6,8}), // expr
[]string{"book_id", "book_intro"}, // Поля вывода
opt, // Опции запроса
)
if err != nil {
log.Fatal("Ошибка запроса к коллекции:", err.Error())
}
Параметр | Описание | Варианты |
---|---|---|
ctx |
Контекст, используемый для управления процессом вызова API. | N/A |
Наименование коллекции |
Наименование коллекции для запроса. | N/A |
Наименование раздела |
Названия разделов для загрузки. Если пусто, выполняется запрос ко всем разделам. | N/A |
expr |
Булево выражение, используемое для фильтрации атрибутов. | Дополнительную информацию см. в Правилах булевых выражений. |
Поля вывода |
Названия полей для возврата. | В текущей версии не поддерживаются векторные поля. |
opts |
Опции запроса, представленные в виде entity.SearchQueryOptionFunc . |
- Limit указывает количество возвращаемых сущностей. - Offset указывает количество сущностей для пропуска в процессе поиска. Сумма этого параметра и Limit должна быть меньше 16384 . - ConsistencyLevel указывает уровень консистентности, применяемый в процессе поиска. - Игнорировать рост указывает, игнорировать ли растущий сегмент в процессе поиска похожих. Значение по умолчанию — False , указывает, что в поиске участвует растущий сегмент. |
Проверьте возвращенный результат.
fmt.Printf("%#v\n", queryResult)
for _, qr := range queryResult {
fmt.Println(qr.IDs)
}
Вычисление количества сущностей
При выполнении запроса можно добавить count(*)
в output_fields
, чтобы Milvus мог возвратить количество сущностей в коллекции. Если необходимо подсчитать количество сущностей, соответствующих определенным условиям, используйте expr
для определения булевого выражения.
Ограничения
При использовании count(*)
в output_fields
запрещено использовать параметр limit
.