Объяснение фильтрации
Milvus предоставляет мощные возможности фильтрации, которые позволяют выполнять точные запросы к вашим данным. Выражения фильтрации позволяют нацеливаться на определенные скалярные поля и уточнять результаты поиска с помощью различных условий. В этом руководстве объясняется, как использовать выражения фильтрации в Milvus, а примеры посвящены операциям запроса. Вы также можете применять эти фильтры в запросах на поиск и удаление.
Основные операторы
Milvus поддерживает несколько основных операторов для фильтрации данных:
Операторы сравнения:
==,!=,>,<,>=и<=позволяют фильтровать данные на основе числовых или текстовых полей.Фильтры диапазонов:
INиLIKEпомогают найти определенные диапазоны или наборы значений.Арифметические операторы:
+,-,*,/,%и**используются для вычислений с числовыми полями.Логические операторы:
AND,ORиNOTобъединяют несколько условий в сложные выражения.Операторы IS NULL и IS NOT NULL: Операторы
IS NULLиIS NOT NULLиспользуются для фильтрации полей на основе того, содержат ли они нулевое значение (отсутствие данных). Подробнее см. в разделе Основные операторы.
Пример: Фильтрация по цвету
Чтобы найти сущности с первичными цветами (красным, зеленым или синим) в скалярном поле color, используйте следующее выражение фильтрации:
filter='color in ["red", "green", "blue"]'
Пример: Фильтрация полей JSON
Milvus позволяет ссылаться на ключи в полях JSON. Например, если у вас есть JSON-поле product с ключами price и model, и вы хотите найти товары с определенной моделью и ценой ниже 1 850, используйте следующее выражение фильтра:
filter='product["model"] == "JSN-087" AND product["price"] < 1850'
Пример: Фильтрация полей массива
Если у вас есть поле массива history_temperatures, содержащее записи о средних температурах, зарегистрированных обсерваториями с 2000 года, и вы хотите найти обсерватории, в которых температура в 2009 году (10-я запись) превысила 23 °C, используйте это выражение:
filter='history_temperatures[10] > 23'
Дополнительные сведения об этих базовых операторах см. в разделе Базовые операторы.
Шаблоны выражений фильтрации
При фильтрации с использованием символов CJK обработка может быть более сложной из-за большего набора символов и различий в кодировке. Это может привести к снижению производительности, особенно при использовании оператора IN.
Milvus вводит шаблонизацию выражений фильтрации для оптимизации производительности при работе с символами CJK. Отделяя динамические значения от выражения фильтра, механизм запросов более эффективно обрабатывает вставку параметров.
Пример
Чтобы найти людей старше 25 лет, проживающих в "北京" (Пекин) или "上海" (Шанхай), используйте следующее шаблонное выражение:
filter = "age > 25 AND city IN ['北京', '上海']"
Чтобы повысить производительность, используйте эту вариацию с параметрами:
filter = "age > {age} AND city in {city}",
filter_params = {"age": 25, "city": ["北京", "上海"]}
Такой подход снижает накладные расходы на синтаксический разбор и повышает скорость выполнения запросов. Дополнительные сведения см. в разделе Шаблонизация фильтров.
Операторы, специфичные для типов данных
Milvus предоставляет расширенные операторы фильтрации для определенных типов данных, таких как поля JSON, ARRAY и VARCHAR.
Операторы, специфичные для полей JSON
Milvus предлагает расширенные операторы для запросов к полям JSON, обеспечивая точную фильтрацию в сложных структурах JSON:
JSON_CONTAINS(identifier, jsonExpr): Проверяет, существует ли выражение JSON в поле.
# JSON data: {"tags": ["electronics", "sale", "new"]}
filter='json_contains(tags, "sale")'
JSON_CONTAINS_ALL(identifier, jsonExpr): : Проверяет наличие всех элементов JSON-выражения.
# JSON data: {"tags": ["electronics", "sale", "new", "discount"]}
filter='json_contains_all(tags, ["electronics", "sale", "new"])'
JSON_CONTAINS_ANY(identifier, jsonExpr): : Фильтрует сущности, для которых в выражении JSON существует хотя бы один элемент.
# JSON data: {"tags": ["electronics", "sale", "new"]}
filter='json_contains_any(tags, ["electronics", "new", "clearance"])'
Более подробную информацию об операторах JSON см. в разделе Операторы JSON.
Операторы, специфичные для полей ARRAY
Milvus предоставляет расширенные операторы фильтрации для полей массивов, таких как ARRAY_CONTAINS, ARRAY_CONTAINS_ALL, ARRAY_CONTAINS_ANY, и ARRAY_LENGTH, которые позволяют осуществлять тонкий контроль над данными массива:
ARRAY_CONTAINS: : Фильтрует сущности, содержащие определенный элемент.
filter="ARRAY_CONTAINS(history_temperatures, 23)"
ARRAY_CONTAINS_ALL: : Фильтрует сущности, в которых присутствуют все элементы списка.
filter="ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])"
ARRAY_CONTAINS_ANY: : Фильтрует сущности, содержащие любой элемент из списка.
filter="ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])"
ARRAY_LENGTH: Фильтрует на основе длины массива.
filter="ARRAY_LENGTH(history_temperatures) < 10"
Более подробную информацию об операторах массивов см. в разделе Операторы ARRAY.
Операторы, специфичные для полей VARCHAR
Milvus предоставляет специализированные операторы для точного текстового поиска по полям VARCHAR:
TEXT_MATCH оператор
Оператор TEXT_MATCH позволяет осуществлять точный поиск документов на основе определенных терминов запроса. Он особенно полезен для фильтрованного поиска, сочетающего скалярные фильтры с поиском по векторному сходству. В отличие от семантического поиска, Text Match фокусируется на точных вхождениях терминов.
Milvus использует Tantivy для поддержки инвертированного индексирования и текстового поиска по терминам. Процесс включает в себя:
Анализатор: Токенизирует и обрабатывает входной текст.
Индексирование: Создает инвертированный индекс, сопоставляющий уникальные лексемы с документами.
Более подробную информацию см. в разделе "Сопоставление текста".
PHRASE_MATCH операторCompatible with Milvus 2.6.x
Оператор PHRASE_MATCH обеспечивает точный поиск документов на основе точного совпадения фраз, учитывая порядок и смежность терминов запроса.
Более подробную информацию см. в разделе "Фразовое соответствие".