Условный запрос
В этой теме рассматривается выполнение условных запросов.
В отличие от поиска похожих векторов, условные запросы извлекают векторы с использованием скалярных фильтров через логические выражения. 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
.