Правила логических выражений
В этой главе рассматривается, как писать выражения для запроса условий.
Обзор
Логическое выражение возвращает булево значение. Milvus фильтрует скаляры, используя предикаты. При вычислении логического выражения оно возвращает TRUE или FALSE. Пожалуйста, обратитесь к справочнику API Python SDK для руководства по использованию логических выражений.
Операторы
Логические операторы
Логические операторы сравнивают два выражения.
Символ | Операция | Пример | Описание |
---|---|---|---|
'and' && | AND | expr1 && expr2 | Возвращает True, когда и expr1, и expr2 истинны. |
'or' || | OR | expr1 || expr2 | Возвращает True, когда либо expr1, либо expr2 истинно. |
Бинарные арифметические операторы
Бинарные арифметические операторы принимают два операнда и выполняют основные арифметические операции, возвращая соответствующий результат.
Символ | Операция | Пример | Описание |
---|---|---|---|
+ | Сложение | a + b | Складывает два операнда. |
- | Вычитание | a - b | Вычитает второй операнд из первого. |
* | Умножение | a * b | Умножает два операнда. |
/ | Деление | a / b | Делит первый операнд на второй. |
** | Возведение в степень | a ** b | Возводит первый операнд в степень второго. |
% | Остаток от деления | a % b | Делит первый операнд на второй и возвращает остаток. |
Операторы отношений
Операторы отношений используют символы для проверки равенства, неравенства или относительного порядка между двумя выражениями.
Символ | Операция | Пример | Описание |
---|---|---|---|
< | Меньше чем | a < b | Возвращает True, если a меньше b. |
> | Больше чем | a > b | Возвращает True, если a больше b. |
== | Равно | a == b | Возвращает True, если a равно b. |
!= | Не равно | a != b | Возвращает True, если a не равно b. |
<= | Меньше или равно | a <= b | Возвращает True, если a меньше или равно b. |
>= | Больше или равно | a >= b | Возвращает True, если a больше или равно b. |
Приоритет операторов и ассоциативность
В следующей таблице приведены приоритет и ассоциативность операторов. Операторы перечислены в порядке приоритета сверху вниз.
Приоритет | Оператор | Описание | Ассоциативность |
---|---|---|---|
1 | + - | Унарные арифметические операторы | Cлева направо |
2 | not | Унарный логический оператор | Справа налево |
3 | ** | Бинарный арифметический оператор | Cлева направо |
4 | * / % | Бинарный арифметический оператор | Cлева направо |
5 | + - | Бинарный арифметический оператор | Cлева направо |
6 | < <= > >= | Операторы сравнения | Cлева направо |
7 | == != | Операторы сравнения | Cлева направо |
8 | like LIKE | Оператор сопоставления | Cлева направо |
9 | json_contains JSON_CONTAINS | Оператор JsonArray | Cлева направо |
10 | json_contains_all JSON_CONTAINS_ALL | Оператор JsonArray | Cлева направо |
11 | json_contains_any JSON_CONTAINS_ANY | Оператор JsonArray | Cлева направо |
12 | && and | Бинарный логический оператор | Cлева направо |
13 | || or | Бинарный логический оператор | Cлева направо |
Выражения обычно вычисляются слева направо. Сложные выражения вычисляются по очереди. Порядок вычисления выражений определяется приоритетом используемых операторов.
Если выражение содержит два или более оператора с одинаковым приоритетом, сначала вычисляется левый оператор.
Например, 10 / 2 * 5 будет вычислено как (10 / 2), и результат будет умножен на 5.
Когда необходимо учитывать операции с более низким приоритетом, их следует заключать в скобки.
Например, 30 / 2 + 8. Обычно считается, что 30 делится на 2, а затем к результату добавляется 8. Если вы хотите разделить на 2 + 8, это должно быть записано как 30 / (2 + 8).
Скобки могут быть вложены в выражение. Сначала вычисляются самые внутренние скобки.
Примеры условий
Вот несколько примеров всех доступных булевых выражений в Milvus (int64
представляет собой скалярное поле, содержащее данные типа INT64, float
представляет собой скалярное поле, содержащее данные типа с плавающей запятой, и VARCHAR
представляет собой скалярное поле, содержащее данные типа VARCHAR):
- Выражение сравнения
"int64 > 0"
"0 < int64 < 400"
"500 < int64"
VARCHAR > "str1"
- Логические операции и скобки
"(int64 > 0 && int64 < 400) или (int64 > 500 && int64 < 1000)"
- Выражение
in
Milvus поддерживает только удаление сущностей с явно определенными первичными ключами, что можно сделать только через выражение in
.
"int64 not in [1, 2, 3]"
VARCHAR not in ["str1", "str2"]
- TermExpr, BinaryLogicalOp и CmpOp (на разных полях)
"int64 in [1, 2, 3] и float != 2"
- BinaryLogicalOp и CmpOp
"int64 == 0 || int64 == 1 || int64 == 2"
- CmpOp и UnaryArithOp или BinaryArithOp
"200+300 < int64"
- MatchOp (префиксное сравнение)
VARCHAR like "prefix%"
- JsonArrayOp
-
JSON_CONTAINS(identifier, JsonExpr)
Если JSON-выражение в операторе
JSON_CONTAINS
(второй параметр) является списком, идентификатор (первый параметр) должен быть списком списков. В противном случае оператор всегда оценивается как False. -
JSON_CONTAINS_ALL(identifier, JsonExpr)
JSON-выражение в операторе
JSON_CONTAINS_ALL
всегда должно быть списком. -
JSON_CONTAINS_ANY(identifier, JsonExpr)
JSON-выражение в операторе
JSON_CONTAINS_ANY
всегда должно быть списком. В противном случае его поведение аналогичноJSON_CONTAINS
.