Правила скалярной фильтрации

Обзор

Выражение предиката выводит булево значение. Milvus осуществляет скалярную фильтрацию путем поиска с помощью предикатов. Выражение с предикатом, когда оно оценивается, возвращает либо TRUE, либо FALSE. Ознакомьтесь с Python SDK API Reference для получения инструкций по использованию предикатных выражений.

Правила грамматикиEBNF описывают правила булевых выражений:

Expr = LogicalExpr | NIL
LogicalExpr = LogicalExpr BinaryLogicalOp LogicalExpr 
              | UnaryLogicalOp LogicalExpr
              | "(" LogicalExpr ")"
              | SingleExpr;
BinaryLogicalOp = "&&" | "and" | "||" | "or";
UnaryLogicalOp = "not";
SingleExpr = TermExpr | CompareExpr;
TermExpr = IDENTIFIER "in" ConstantArray;
Constant = INTEGER | FLOAT
ConstantExpr = Constant
               | ConstantExpr BinaryArithOp ConstantExpr
               | UnaryArithOp ConstantExpr;
                                                          
ConstantArray = "[" ConstantExpr { "," ConstantExpr } "]";
UnaryArithOp = "+" | "-"
BinaryArithOp = "+" | "-" | "*" | "/" | "%" | "**";
CompareExpr = IDENTIFIER CmpOp IDENTIFIER
              | IDENTIFIER CmpOp ConstantExpr
              | ConstantExpr CmpOp IDENTIFIER
              | ConstantExpr CmpOpRestricted IDENTIFIER CmpOpRestricted ConstantExpr;
CmpOpRestricted = "<" | "<=";
CmpOp = ">" | ">=" | "<" | "<=" | "=="| "!=";
MatchOp = "like" | "LIKE";
JsonArrayOps = JsonDefs "(" IDENTIFIER "," JsonExpr | JsonArray ")";
JsonArrayDefs = "json_contains" | "JSON_CONTAINS" 
           | "json_contains_all" | "JSON_CONTAINS_ALL" 
           | "json_contains_any" | "JSON_CONTAINS_ANY";
JsonExpr =  Constant | ConstantArray | STRING | BOOLEAN;
JsonArray = "[" JsonExpr { "," JsonExpr } "]";
ArrayOps = ArrayDefs "(" IDENTIFIER "," ArrayExpr | Array ")";
ArrayDefs = "array_contains" | "ARRAY_CONTAINS" 
           | "array_contains_all" | "ARRAY_CONTAINS_ALL" 
           | "array_contains_any" | "ARRAY_CONTAINS_ANY"
           | "array_length"       | "ARRAY_LENGTH";
ArrayExpr =  Constant | ConstantArray | STRING | BOOLEAN;
Array = "[" ArrayExpr { "," ArrayExpr } "]";

В следующей таблице приведено описание каждого символа, упомянутого в приведенных выше правилах булевых выражений.

Условное обозначениеОписание
=Определение.
,Конкатенация.
;Окончание.
|Альтернация.
{...}Повторение.
(...)Группировка.
NILПустой. Выражение может быть пустой строкой.
INTEGERЦелые числа, такие как 1, 2, 3.
FLOATПлавающие числа, такие как 1,0, 2,0.
CONSTЦелочисленные или плавающие числа.
ИДЕНТИФИКАТОРИдентификатор. В Milvus IDENTIFIER представляет собой имя поля.
LogicalOpLogicalOp - это логический оператор, который поддерживает объединение более одной реляционной операции в одном сравнении. Возвращаемое значение LogicalOp - TRUE (1) или FALSE (0). Существует два типа логических операторов, включая BinaryLogicalOps и UnaryLogicalOps.
UnaryLogicalOpUnaryLogicalOp обозначает унарный логический оператор "не".
BinaryLogicalOpБинарные логические операторы, которые выполняют действия над двумя операндами. В сложных выражениях с двумя и более операндами порядок оценки зависит от правил старшинства.
ArithmeticOpArithmeticOp, а именно арифметический оператор, выполняет над операндами такие математические операции, как сложение и вычитание.
UnaryArithOpUnaryArithOp - это арифметический оператор, выполняющий операцию над одним операндом. Отрицательный UnaryArithOp меняет положительное выражение на отрицательное, или наоборот.
BinaryArithOpBinaryArithOp, а именно бинарный оператор, выполняет операции над двумя операндами. В сложных выражениях с двумя и более операндами порядок оценки зависит от правил старшинства.
CmpOpCmpOp - это реляционный оператор, выполняющий действия над двумя операндами.
CmpOpRestrictedCmpOpRestricted ограничивается операторами "Меньше чем" и "Равно".
ConstantExprConstantExpr может быть константой или двоичнымArithOp на двух ConstExpr или унарнымArithOp на одном ConstantExpr. Он определяется рекурсивно.
ConstantArrayConstantArray заключен в квадратные скобки, а ConstantExpr может повторяться в квадратных скобках. ConstArray должен включать хотя бы один ConstantExpr.
TermExprTermExpr используется для проверки наличия значения ИДЕНТИФИКАТОРА в массиве ConstantArray. TermExpr обозначается символом "in".
CompareExprCompareExpr, то есть выражение сравнения, может быть реляционной операцией над двумя IDENTIFIER, или реляционной операцией над одним IDENTIFIER и одним ConstantExpr, или тернарной операцией над двумя ConstantExpr и одним IDENTIFIER.
SingleExprSingleExpr, а именно одно выражение, может быть либо TermExpr, либо CompareExpr.
LogicalExprLogicalExpr может быть двоичным LogicalOp над двумя LogicalExpr, или унарным LogicalOp над одним LogicalExpr, или LogicalExpr, сгруппированным в круглых скобках, или SingleExpr. LogicalExpr определяется рекурсивно.
ExprExpr - аббревиатура, означающая выражение, может быть LogicalExpr или NIL.
MatchOpMatchOp, а именно оператор соответствия, сравнивает строку со строковой константой или строковой префиксной, инфиксной или суффиксной константой.
JsonArrayOpJsonOp, а именно оператор JSON, проверяет, содержит ли указанный идентификатор указанные элементы.
ArrayOpArrayOp, а именно оператор массива, проверяет, содержит ли указанный идентификатор указанные элементы.

Операторы

Логические операторы

Логические операторы выполняют сравнение между двумя выражениями.

СимволОперацияПримерОписание
'и' &&иexpr1 && expr2Истинно, если оба expr1 и expr2 истинны.
'or' ||илиexpr1 || expr2Истинно, если истинно либо expr1, либо expr2.

Двоичные арифметические операторы

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

СимволОперацияПримерОписание
+Сложениеa + bСложение двух операндов.
-Вычитаниеa - bВычитание второго операнда из первого.
*Умножениеa * bУмножение двух операндов.
/Делениеa / bРазделите первый операнд на второй операнд.
**Мощностьa ** bВозведите первый операнд в степень второго операнда.
%Moduloa % bДелит первый операнд на второй операнд и выдает остаток.

Реляционные операторы

Реляционные операторы используют символы для проверки равенства, неравенства или относительного порядка между двумя выражениями.

СимволОперацияПримерОписание
<Меньше, чемa < bИстина, если a меньше b.
>Больше, чемa > bВерно, если a больше b.
==Равноa == bИстинно, если a равно b.
!=Не равноa != bИстинно, если a не равно b.
<=Меньше или равноa <= bВерно, если a меньше или равно b.
>=Больше или равноa >= bИстинно, если a больше или равно b.

Старшинство и ассоциативность операторов

В следующей таблице перечислены старшинство и ассоциативность операторов. Операторы перечислены сверху вниз, в порядке убывания старшинства.

ПриоритетОператорОписаниеАссоциативность
1+ -UnaryArithOpСлева направо
2неUnaryLogicOpСправа налево
3**BinaryArithOpСлева направо
4* / %BinaryArithOpСлева направо
5+ -BinaryArithOpСлева направо
6< <= > >=CmpOpСлева направо
7== !=CmpOpСлева направо
8как LIKEMatchOpСлева направо
9json_contains JSON_CONTAINSJsonArrayOpСлева направо
9array_contains ARRAY_CONTAINSArrayOpСлева направо
10json_contains_all JSON_CONTAINS_ALLJsonArrayOpСлева направо
10array_contains_all ARRAY_CONTAINS_ALLArrayOpСлева направо
11json_contains_any JSON_CONTAINS_ANYJsonArrayOpСлева направо
11array_contains_any ARRAY_CONTAINS_ANYArrayOpСлева направо
12array_length ARRAY_LENGTHArrayOpСлева направо
13&& иBinaryLogicOpСлева направо
14|| илиBinaryLogicOpСлева направо

Выражения обычно оцениваются слева направо. Сложные выражения оцениваются по очереди. Порядок, в котором оцениваются выражения, определяется старшинством используемых операторов.

Если выражение содержит два или более операторов с одинаковым старшинством, первым оценивается оператор, стоящий слева.

Например, 10 / 2 * 5 будет оценено как (10 / 2), а результат умножен на 5.

Когда операция с меньшим старшинством должна обрабатываться первой, ее следует заключить в круглые скобки.

Например, 30 / 2 + 8. Это обычно оценивается как 30, деленное на 2, а затем к результату прибавляется 8. Если вы хотите разделить на 2 + 8, это должно быть записано как 30 / (2 + 8).

Скобки могут быть вложены в выражения. Самые внутренние выражения со скобками оцениваются первыми.

Использование

Примеры использования всех доступных булевых выражений в Milvus приведены ниже (int64 представляет скалярное поле, содержащее данные типа INT64, float представляет скалярное поле, содержащее данные типа с плавающей точкой, и VARCHAR представляет скалярное поле, содержащее данные типа VARCHAR):

  1. CmpOp
"int64 > 0"
"0 < int64 < 400"
"500 <= int64 < 1000"
VARCHAR > "str1"
  1. BinaryLogicalOp и круглые скобки
"(int64 > 0 && int64 < 400) or (int64 > 500 && int64 < 1000)"
  1. TermExpr и UnaryLogicOp
"int64 not in [1, 2, 3]"
VARCHAR not in ["str1", "str2"]
  1. TermExpr, BinaryLogicalOp и CmpOp (для разных полей)
"int64 in [1, 2, 3] and float != 2"
  1. BinaryLogicalOp и CmpOp
"int64 == 0 || int64 == 1 || int64 == 2"
  1. CmpOp и UnaryArithOp или BinaryArithOp
"200+300 < int64 <= 500+500"
  1. MatchOp
VARCHAR like "prefix%"
VARCHAR like "%suffix"
VARCHAR like "%middle%"
VARCHAR like "_suffix"
  1. JsonArrayOp
  • JSON_CONTAINS(identifier, JsonExpr)

    Если JSON-выражение оператора JSON_CONTAINS (второй аргумент) представляет собой список, то идентификатор (первый аргумент) должен быть списком списка. В противном случае оператор всегда оценивается как False.

    # {"x": [1,2,3]}
    json_contains(x, 1) # ==> true
    json_contains(x, "a") # ==> false
        
    # {"x": [[1,2,3], [4,5,6], [7,8,9]]}
    json_contains(x, [1,2,3]) # ==> true
    json_contains(x, [3,2,1]) # ==> false
    
  • JSON_CONTAINS_ALL(identifier, JsonExpr)

    Выражение JSON в утверждении JSON_CONTAINS_ALL всегда должно быть списком.

    # {"x": [1,2,3,4,5,7,8]}
    json_contains_all(x, [1,2,8]) # ==> true
    json_contains_all(x, [4,5,6]) # ==> false 6 is not exists
    
  • JSON_CONTAINS_ANY(identifier, JsonExpr)

    Выражение JSON в утверждении JSON_CONTAINS_ANY всегда должно быть списком. В противном случае оно действует так же, как и JSON_CONTAINS.

    # {"x": [1,2,3,4,5,7,8]}
    json_contains_any(x, [1,2,8]) # ==> true
    json_contains_any(x, [4,5,6]) # ==> true
    json_contains_any(x, [6,9]) # ==> false
    
  1. ArrayOp
  • ARRAY_CONTAINS(identifier, ArrayExpr)

    Если выражение массива в утверждении ARRAY_CONTAINS (второй аргумент) является списком, то идентификатор (первый аргумент) должен быть списком списка. В противном случае оператор всегда оценивается как False.

    # 'int_array': [1,2,3]
    array_contains(int_array, 1) # ==> true
    array_contains(int_array, "a") # ==> false
    
  • ARRAY_CONTAINS_ALL(identifier, ArrayExpr)

    Выражение массива в утверждении ARRAY_CONTAINS_ALL всегда должно быть списком.

    # "int_array": [1,2,3,4,5,7,8]
    array_contains_all(int_array, [1,2,8]) # ==> true
    array_contains_all(int_array, [4,5,6]) # ==> false 6 is not exists
    
  • ARRAY_CONTAINS_ANY(identifier, ArrayExpr)

    Выражение массива в операторе ARRAY_CONTAINS_ANY всегда должно быть списком. В противном случае оно действует так же, как и ARRAY_CONTAINS.

    # "int_array": [1,2,3,4,5,7,8]
    array_contains_any(int_array, [1,2,8]) # ==> true
    array_contains_any(int_array, [4,5,6]) # ==> true
    array_contains_any(int_array, [6,9]) # ==> false
    
  • ARRAY_LENGTH(identifier)

    Проверьте количество элементов в массиве.

    # "int_array": [1,2,3,4,5,7,8]
    array_length(int_array) # ==> 7
    

Что дальше

Теперь, когда вы знаете, как работают битовые наборы в Milvus, вам также может быть интересно:

Попробуйте Managed Milvus бесплатно

Zilliz Cloud работает без проблем, поддерживается Milvus и в 10 раз быстрее.

Начать
Обратная связь

Была ли эта страница полезной?