milvus-logo
LFAI
Home
  • Guía del usuario

Reglas de filtrado escalar

Resumen

Una expresión de predicado produce un valor booleano. Milvus realiza el filtrado escalar buscando con predicados. Una expresión predicada, cuando se evalúa, devuelve TRUE o FALSE. Consulte la Referencia de la API del SDK de Python para obtener instrucciones sobre el uso de expresiones de predicado.

Las reglas de la gramáticaEBNF describen las reglas de las expresiones booleanas:

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 } "]";

La siguiente tabla muestra la descripción de cada símbolo mencionado en las reglas de expresiones booleanas anteriores.

NotaciónDescripción
=Definición.
,Concatenación.
;Terminación.
|Alternancia.
{...}Repetición.
(...)Agrupación.
NILVacío. La expresión puede ser una cadena vacía.
INTEGERNúmeros enteros como 1, 2, 3.
FLOATNúmeros flotantes como 1.0, 2.0.
CONSTNúmeros enteros o flotantes.
IDENTIFICADORIdentificador. En Milvus, el IDENTIFIER representa el nombre del campo.
LogicalOpUna LogicalOp es un operador lógico que permite combinar más de una operación relacional en una comparación. El valor devuelto por una LogicalOp es TRUE (1) o FALSE (0). Existen dos tipos de LogicalOps: BinaryLogicalOps y UnaryLogicalOps.
UnaryLogicalOpUnaryLogicalOp hace referencia al operador lógico unario "not".
BinaryLogicalOpOperadores lógicos binarios que realizan acciones sobre dos operandos. En una expresión compleja con dos o más operandos, el orden de evaluación depende de las reglas de precedencia.
ArithmeticOpUn ArithmeticOp, es decir, un operador aritmético, realiza operaciones matemáticas como sumas y restas sobre operandos.
UnaryArithOpUn UnaryArithOp es un operador aritmético que realiza una operación sobre un único operando. El UnaryArithOp negativo cambia una expresión positiva en negativa, o al revés.
BinaryArithOpUn BinaryArithOp, es decir, un operador binario, realiza operaciones sobre dos operandos. En una expresión compleja con dos o más operandos, el orden de evaluación depende de las reglas de precedencia.
CmpOpCmpOp es un operador relacional que realiza acciones sobre dos operandos.
CmpOpRestrictedCmpOpRestricted está restringido a "Menor que" e "Igual a".
ConstantExprConstantExpr puede ser una Constante o un BinaryArithOp sobre dos ConstExprs o un UnaryArithOp sobre una única ConstantExpr. Se define de forma recursiva.
ConstantArrayConstantArray está envuelto por corchetes, y ConstantExpr puede repetirse en los corchetes. ConstArray debe incluir al menos una ConstantExpr.
TermExprTermExpr se utiliza para comprobar si el valor de un IDENTIFIER aparece en un ConstantArray. TermExpr se representa mediante "in".
CompareExprUna CompareExpr, es decir, una expresión de comparación, puede ser una operación relacional sobre dos IDENTIFIERs, o una operación relacional sobre un IDENTIFIER y una ConstantExpr, o una operación ternaria sobre dos ConstantExprs y un IDENTIFIER.
SingleExprSingleExpr, es decir, una única expresión, puede ser un TermExpr o un CompareExpr.
LogicalExprUna LogicalExpr puede ser una BinaryLogicalOp sobre dos LogicalExprs, o una UnaryLogicalOp sobre una única LogicalExpr, o una LogicalExpr agrupada entre paréntesis, o una SingleExpr. La LogicalExpr se define de forma recursiva.
ExprExpr, abreviatura que significa expresión, puede ser LogicalExpr o NIL.
MatchOpUn MatchOp, es decir, un operador de coincidencia, compara una cadena con una constante de cadena o una constante prefija, infija o sufija de cadena.
JsonArrayOpUn JsonOp, es decir, un operador JSON, comprueba si el identificador especificado contiene los elementos especificados.
ArrayOpUn ArrayOp, es decir, un operador de matriz, comprueba si el identificador especificado contiene los elementos especificados.

Operadores

Operadores lógicos

Los operadores lógicos comparan dos expresiones.

SímboloOperaciónEjemploDescripción
y' &&yexpr1 && expr2Verdadero si tanto expr1 como expr2 son verdaderos.
o' ||oexpr1 || expr2Verdadero si expr1 o expr2 son verdaderos.

Operadores aritméticos binarios

Los operadores aritméticos binarios contienen dos operandos y pueden realizar operaciones aritméticas básicas y devolver el resultado correspondiente.

SímboloOperaciónEjemploDescripción
+Sumaa + bSuma los dos operandos.
-Restaa - bRestar el segundo operando del primer operando.
*Multiplicacióna * bMultiplicar los dos operandos.
/Divisióna / bDivide el primer operando por el segundo operando.
**Potenciaa ** bEleva el primer operando a la potencia del segundo operando.
%Móduloa % bDivide el primer operando por el segundo y devuelve la parte del resto.

Operadores relacionales

Los operadores relacionales utilizan símbolos para comprobar la igualdad, desigualdad u orden relativo entre dos expresiones.

SímboloOperaciónEjemploDescripción
<Menor quea < bVerdadero si a es menor que b.
>Mayor quea > bVerdadero si a es mayor que b.
==Iguala == bVerdadero si a es igual a b.
!=No es iguala != bVerdadero si a no es igual a b.
<=Menor o igual quea <= bVerdadero si a es menor o igual que b.
>=Mayor o igual quea >= bVerdadero si a es mayor o igual que b.

Precedencia y asociatividad de los operadores

La siguiente tabla muestra la precedencia y asociatividad de los operadores. Los operadores se enumeran de arriba a abajo, en orden descendente de precedencia.

PrecedenciaOperadorDescripciónAsociatividad
1+ -UnaryArithOpDe izquierda a derecha
2noUnaryLogicOpDe derecha a izquierda
3**BinaryArithOpDe izquierda a derecha
4* / %BinaryArithOpDe izquierda a derecha
5+ -BinaryArithOpDe izquierda a derecha
6< <= > >=CmpOpDe izquierda a derecha
7== !=CmpOpDe izquierda a derecha
8como LIKEMatchOpDe izquierda a derecha
9json_contains JSON_CONTAINSJsonArrayOpDe izquierda a derecha
9array_contains ARRAY_CONTAINSArrayOpDe izquierda a derecha
10json_contains_all JSON_CONTAINS_ALLJsonArrayOpDe izquierda a derecha
10array_contains_all ARRAY_CONTAINS_ALLArrayOpDe izquierda a derecha
11json_contains_any JSON_CONTAINS_ANYJsonArrayOpDe izquierda a derecha
11array_contains_any ARRAY_CONTAINS_ANYArrayOpDe izquierda a derecha
12array_length ARRAY_LENGTHArrayOpDe izquierda a derecha
13&& yBinaryLogicOpDe izquierda a derecha
14|| oBinaryLogicOpDe izquierda a derecha

Las expresiones se evalúan normalmente de izquierda a derecha. Las expresiones complejas se evalúan de una en una. El orden en que se evalúan las expresiones viene determinado por la precedencia de los operadores utilizados.

Si una expresión contiene dos o más operadores con la misma precedencia, se evalúa primero el operador de la izquierda.

Por ejemplo, 10 / 2 * 5 se evaluará como (10 / 2) y el resultado se multiplicará por 5.

Cuando una operación de menor precedencia debe procesarse primero, debe ir entre paréntesis.

Por ejemplo, 30 / 2 + 8. Esto se evalúa normalmente como 30 dividido por 2 y luego 8 añadido al resultado. Si desea dividir por 2 + 8, debe escribirse como 30 / (2 + 8).

Los paréntesis pueden anidarse dentro de expresiones. Las expresiones entre paréntesis más internas se evalúan primero.

Utilización

A continuación se muestran ejemplos del uso de todas las expresiones booleanas disponibles en Milvus (int64 representa el campo escalar que contiene datos de tipo INT64, float representa el campo escalar que contiene datos de tipo coma flotante, y VARCHAR representa el campo escalar que contiene datos de tipo VARCHAR):

  1. CmpOp
"int64 > 0"
"0 < int64 < 400"
"500 <= int64 < 1000"
VARCHAR > "str1"
  1. BinaryLogicalOp y paréntesis
"(int64 > 0 && int64 < 400) or (int64 > 500 && int64 < 1000)"
  1. TermExpr y UnaryLogicOp
"int64 not in [1, 2, 3]"
VARCHAR not in ["str1", "str2"]
  1. TermExpr, BinaryLogicalOp y CmpOp (en campos diferentes)
"int64 in [1, 2, 3] and float != 2"
  1. BinaryLogicalOp y CmpOp
"int64 == 0 || int64 == 1 || int64 == 2"
  1. CmpOp y UnaryArithOp o 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)

    Si la expresión JSON de una sentencia JSON_CONTAINS (el segundo argumento) es una lista, el identificador (el primer argumento) debe ser list of list. En caso contrario, la sentencia siempre se evalúa como 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)

    La expresión JSON de una sentencia JSON_CONTAINS_ALL debe ser siempre una lista.

    # {"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)

    La expresión JSON de una sentencia JSON_CONTAINS_ANY debe ser siempre una lista. De lo contrario, actúa igual que 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)

    Si la expresión array de una sentencia ARRAY_CONTAINS (el segundo argumento) es una lista, el identificador (el primer argumento) debe ser list of list. En caso contrario, la sentencia siempre se evalúa como False.

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

    La expresión de matriz de una sentencia ARRAY_CONTAINS_ALL debe ser siempre una lista.

    # "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)

    La expresión de matriz de una sentencia ARRAY_CONTAINS_ANY debe ser siempre una lista. En caso contrario, actúa igual que 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)

    Comprueba el número de elementos de un array.

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

Lo que sigue

Ahora que ya sabe cómo funcionan los conjuntos de bits en Milvus, puede que también quiera

Traducido porDeepL

Try Managed Milvus for Free

Zilliz Cloud is hassle-free, powered by Milvus and 10x faster.

Get Started
Feedback

¿Fue útil esta página?