Основные операторы
Milvus предоставляет богатый набор базовых операторов, которые помогут вам эффективно фильтровать и запрашивать данные. Эти операторы позволяют уточнять условия поиска на основе скалярных полей, числовых вычислений, логических условий и многого другого. Понимание того, как использовать эти операторы, очень важно для создания точных запросов и повышения эффективности поиска.
Операторы сравнения
Операторы сравнения используются для фильтрации данных на основе равенства, неравенства или размера. Они применимы к числовым и текстовым полям.
Поддерживаемые операторы сравнения:
==(Равно)!=(Не равно)>(Больше, чем)<(Меньше, чем)>=(Больше или равно)<=(Меньше или равно)
Пример 1: Фильтрация с помощью Equal To (==)
Предположим, у вас есть поле с именем status, и вы хотите найти все сущности, в которых status является "активным". Для этого можно использовать оператор равенства ==:
filter = 'status == "active"'
Пример 2: Фильтрация с помощью Not Equal To (!=)
Чтобы найти сущности, в которых status не является "неактивным":
filter = 'status != "inactive"'
Пример 3: Фильтрация с помощью Greater Than (>)
Если вы хотите найти все сущности с age больше 30:
filter = 'age > 30'
Пример 4: Фильтрация с помощью Less Than
Чтобы найти сущности, у которых price меньше 100:
filter = 'price < 100'
Пример 5: Фильтрация с помощью Greater Than or Equal To (>=)
Если вы хотите найти все сущности с rating больше или равным 4:
filter = 'rating >= 4'
Пример 6: Фильтрация с помощью Less Than or Equal To
Чтобы найти сущности с discount меньше или равным 10%:
filter = 'discount <= 10'
Операторы диапазона
Операторы диапазона помогают фильтровать данные на основе определенных наборов или диапазонов значений.
Поддерживаемые операторы диапазона:
IN: Используются для поиска значений в определенном наборе или диапазоне.LIKE: : Используется для соответствия шаблону (в основном для текстовых полей). Milvus позволяет построить индексNGRAMна полях VARCHAR или JSON для ускорения текстовых запросов. Подробности см. в разделе NGRAM.
Пример 1: Использование IN для поиска нескольких значений
Если вы хотите найти все сущности, для которых color является либо "красным", либо "зеленым", либо "синим":
filter = 'color in ["red", "green", "blue"]'
Это полезно, когда нужно проверить принадлежность к списку значений.
Пример 2: Использование LIKE для сопоставления с образцом
Оператор LIKE используется для поиска шаблонов в строковых полях. Он может сопоставлять подстроки в различных позициях в тексте: в качестве префикса, инфикса или суффикса. Оператор LIKE использует символ % в качестве подстановочного знака, который может соответствовать любому количеству символов (включая ноль).
В большинстве случаев инфиксное или суффиксное сопоставление значительно медленнее префиксного. Используйте их с осторожностью, если производительность очень важна.
Префиксное совпадение (начинается с)
Чтобы выполнить префиксное соответствие, когда строка начинается с заданного шаблона, можно поместить шаблон в начало и использовать % для соответствия всем символам, следующим за ним. Например, чтобы найти все продукты, чье name начинается с "Prod":
filter = 'name LIKE "Prod%"'
В этом случае будет найден любой продукт, название которого начинается с "Prod", например "Product A", "Product B" и т. д.
Суффиксное совпадение (заканчивается на)
Для суффиксного совпадения, когда строка заканчивается заданным шаблоном, поместите символ % в начало шаблона. Например, чтобы найти все продукты, чей name заканчивается на "XYZ":
filter = 'name LIKE "%XYZ"'
В этом случае будет найден любой продукт, название которого заканчивается на "XYZ", например "ProductXYZ", "SampleXYZ" и т. д.
Инфиксное совпадение (Contains)
Чтобы выполнить инфиксное совпадение, при котором шаблон может встречаться в любом месте строки, вы можете поместить символ % как в начало, так и в конец шаблона. Например, чтобы найти все продукты, в названии которых name содержится слово "Pro":
filter = 'name LIKE "%Pro%"'
В этом случае будет найден любой продукт, в названии которого содержится подстрока "Pro", например "Product", "ProLine" или "SuperPro".
Арифметические операторы
Арифметические операторы позволяют создавать условия на основе вычислений с использованием числовых полей.
Поддерживаемые арифметические операторы:
+(Сложение)-(Вычитание)*(Умножение)/(Деление)%(Модуль)**(Экспоненция)
Пример 1: Использование модуля (%)
Нахождение сущностей, для которых id является четным числом (т.е. кратным 2):
filter = 'id % 2 == 0'
Пример 2: Использование экспоненции (**)
Для поиска сущностей, в которых price, возведенное в степень 2, больше 1000:
filter = 'price ** 2 > 1000'
Логические операторы
Логические операторы используются для объединения нескольких условий в более сложное выражение фильтра. К ним относятся AND, OR и NOT.
Поддерживаемые логические операторы:
AND: Объединяет несколько условий, которые все должны быть истинными.OR: : Комбинирует условия, из которых хотя бы одно должно быть истинным.NOT: Отрицает условие.
Пример 1: Использование AND для объединения условий
Найти все товары, в которых price больше 100, а stock больше 50:
filter = 'price > 100 AND stock > 50'
Пример 2: Использование OR для объединения условий
Найти все товары, для которых color является либо "красным", либо "синим":
filter = 'color == "red" OR color == "blue"'
Пример 3: Использование NOT для исключения условия
Чтобы найти все продукты, для которых color не является "зеленым":
filter = 'NOT color == "green"'
Операторы IS NULL и IS NOT NULL
Операторы IS NULL и IS NOT NULL используются для фильтрации полей на основе того, содержат ли они нулевое значение (отсутствие данных).
IS NULL: Определяет сущности, в которых определенное поле содержит нулевое значение, т. е. значение отсутствует или не определено.IS NOT NULL: Определяет сущности, в которых определенное поле содержит любое значение, отличное от null, что означает, что поле имеет действительное, определенное значение.
Операторы не зависят от регистра, поэтому вы можете использовать IS NULL или is null, а также IS NOT NULL или is not null.
Регулярные скалярные поля с нулевыми значениями
Milvus позволяет фильтровать обычные скалярные поля, такие как строки или числа, с нулевыми значениями.
Пустая строка "" не рассматривается как нулевое значение для поля VARCHAR.
Чтобы получить сущности, в которых поле description является нулевым:
filter = 'description IS NULL'
Чтобы получить сущности, в которых поле description не является нулевым:
filter = 'description IS NOT NULL'
Чтобы получить сущности, в которых поле description не является нулевым, а поле price больше 10:
filter = 'description IS NOT NULL AND price > 10'
Поля JSON с нулевыми значениями
Milvus позволяет фильтровать поля JSON, содержащие нулевые значения. Поле JSON считается нулевым в следующих случаях:
Весь объект JSON явно имеет значение None (null), например,
{"metadata": None}.Само JSON-поле полностью отсутствует в сущности.
Если некоторые элементы в JSON-объекте являются нулевыми (например, отдельные ключи), поле все равно считается ненулевым. Например, \{"metadata": \{"category": None, "price": 99.99}} не рассматривается как null, даже если ключ category является null.
Чтобы проиллюстрировать, как Milvus обрабатывает поля JSON с нулевыми значениями, рассмотрим следующий пример данных с полем JSON metadata:
data = [
{
"metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},
"pk": 1,
"embedding": [0.12, 0.34, 0.56]
},
{
"metadata": None, # Entire JSON object is null
"pk": 2,
"embedding": [0.56, 0.78, 0.90]
},
{ # JSON field `metadata` is completely missing
"pk": 3,
"embedding": [0.91, 0.18, 0.23]
},
{
"metadata": {"category": None, "price": 99.99, "brand": "BrandA"}, # Individual key value is null
"pk": 4,
"embedding": [0.56, 0.38, 0.21]
}
]
Пример 1: Получение сущностей, метаданные которых равны null
Чтобы найти сущности, в которых поле metadata либо отсутствует, либо явно установлено значение None:
filter = 'metadata IS NULL'
# Example output:
# data: [
# "{'metadata': None, 'pk': 2}",
# "{'metadata': None, 'pk': 3}"
# ]
Пример 2: Получить сущности, метаданные которых не равны null
Чтобы найти сущности, в которых поле metadata не является нулевым:
filter = 'metadata IS NOT NULL'
# Example output:
# data: [
# "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
# "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]
Поля ARRAY с нулевыми значениями
Milvus позволяет фильтровать поля ARRAY, содержащие нулевые значения. Поле ARRAY считается нулевым в следующих случаях:
Для всего поля ARRAY явно установлено значение None (null), например,
"tags": None.Поле ARRAY полностью отсутствует в сущности.
Поле ARRAY не может содержать частичные нулевые значения, так как все элементы в поле ARRAY должны иметь одинаковый тип данных. Подробнее см. в разделе Поле массива.
Чтобы проиллюстрировать, как Milvus обрабатывает поля ARRAY с нулевыми значениями, рассмотрим следующий пример данных с полем ARRAY tags:
data = [
{
"tags": ["pop", "rock", "classic"],
"ratings": [5, 4, 3],
"pk": 1,
"embedding": [0.12, 0.34, 0.56]
},
{
"tags": None, # Entire ARRAY is null
"ratings": [4, 5],
"pk": 2,
"embedding": [0.78, 0.91, 0.23]
},
{ # The tags field is completely missing
"ratings": [9, 5],
"pk": 3,
"embedding": [0.18, 0.11, 0.23]
}
]
Пример 1: Получение сущностей, для которых значение tags равно null
Чтобы получить сущности, в которых поле tags либо отсутствует, либо явно установлено в None:
filter = 'tags IS NULL'
# Example output:
# data: [
# "{'tags': None, 'ratings': [4, 5], 'embedding': [0.78, 0.91, 0.23], 'pk': 2}",
# "{'tags': None, 'ratings': [9, 5], 'embedding': [0.18, 0.11, 0.23], 'pk': 3}"
# ]
Пример 2: Получение сущностей, в которых поле tags не равно null
Получение сущностей, в которых поле tags не является нулевым:
filter = 'tags IS NOT NULL'
# Example output:
# data: [
# "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
# "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]
Советы по использованию основных операторов с полями JSON и ARRAY
Хотя базовые операторы в Milvus универсальны и могут применяться к скалярным полям, их также можно эффективно использовать с ключами и индексами в полях JSON и ARRAY.
Например, если у вас есть поле product, содержащее несколько ключей, таких как price, model и tags, всегда ссылайтесь непосредственно на ключ:
filter = 'product["price"] > 1000'
Чтобы найти записи, в которых первая температура в массиве записанных температур превышает определенное значение, используйте:
filter = 'history_temperatures[0] > 30'
Заключение .
Milvus предлагает ряд базовых операторов, которые обеспечивают гибкость при фильтрации и запросе данных. Комбинируя операторы сравнения, диапазона, арифметические и логические операторы, вы можете создавать мощные выражения фильтрации для сужения результатов поиска и эффективного извлечения нужных данных.
ЧАСТО ЗАДАВАЕМЫЕ ВОПРОСЫ
Существует ли ограничение на длину списка значений в условиях фильтрации (например, filter='color in ['red', 'green', 'blue']')? Что делать, если список слишком длинный?
Zilliz Cloud не устанавливает ограничения на длину списка значений совпадения в условиях фильтрации. Однако слишком длинный список может существенно повлиять на производительность запроса. Если условие фильтрации включает длинный список значений соответствия или сложное выражение с большим количеством элементов, мы рекомендуем использовать шаблонизацию фильтра для повышения производительности запроса.