Выполнение условных запросов

Эта тема представляет введение в выполнение условных запросов, аналогичных условиям 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.