Условный запрос

В этой теме рассматривается выполнение условных запросов.

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

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

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

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

from pymilvus import Collection
collection = Collection("book")      # Получить существующую коллекцию.
collection.load()

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

В следующем примере векторы фильтруются на основе конкретных значений book_id и возвращаются поля book_id и book_intro в результатах.

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

Вы также можете использовать динамические поля в выражении фильтрации и указать поля вывода в запросе. Например, обратитесь к [Динамической схеме](Dynamic Schema).

res = collection.query(
  expr = "book_id in [2,4,6,8]",
  offset = 0,
  limit = 10, 
  output_fields = ["book_id", "book_intro"],
)
Параметр Описание
expr Логическое выражение, используемое для фильтрации свойств. Для получения дополнительных сведений о правилах логических выражений обратитесь к Правилам логических выражений.
limit Количество возвращаемых наиболее похожих результатов. Сумма этого значения и offset должна быть меньше 16384.
offset Количество результатов, которые нужно пропустить в коллекции. Доступно только при указании limit, и сумма этого значения и limit должна быть меньше 16384. Например, если вы хотите запросить 9-го и 10-го ближайших соседей вектора, установите limit равным 2, а offset равным 8.
output_fields (необязательно) Список названий полей для возврата.
partition_names (необязательно) Список названий разделов для запроса.
consistency_level (необязательно) Уровень согласованности для запроса.

Проверьте полученные результаты.

sorted_res = sorted(res, key=lambda k: k['book_id'])
sorted_res

Подсчет сущностей

При выполнении запроса вы можете добавить count(*) в output_fields, чтобы Milvus мог вернуть количество сущностей в коллекции. Если вы хотите подсчитать количество сущностей, удовлетворяющих определенным условиям, используйте expr для определения логического выражения.

Подсчитайте все сущности в коллекции:

res = collection.query(
  expr="", 
  output_fields = ["count(*)"],
)

print(res)
print(res[0])

Подсчитайте количество сущностей, удовлетворяющих определенным условиям фильтрации:

res = collection.query(
  expr="book_id in [2,4,6,8]", 
  output_fields = ["count(*)"],
)

print(res)
print(res[0])

Ограничения

При использовании count(*) в output_fields запрещено использование параметра limit.