milvus-logo
LFAI
Home
  • Guia do utilizador

Regras de filtragem escalar

Síntese

Uma expressão de predicado produz um valor booleano. Milvus conduz a filtragem escalar pesquisando com predicados. Uma expressão de predicado, quando avaliada, devolve TRUE (verdadeiro) ou FALSE (falso). Consulte a Referência da API do Python SDK para obter instruções sobre a utilização de expressões de predicado.

As regras da gramáticaEBNF descrevem as regras das expressões 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 } "]";

A tabela seguinte lista a descrição de cada símbolo mencionado nas regras de expressão booleana acima.

NotaçãoDescrição
=Definição.
,Concatenação.
;Terminação.
|Alternância.
{...}Repetição.
(...)Agrupamento.
NILVazio. A expressão pode ser uma cadeia vazia.
INTEGERNúmeros inteiros como 1, 2, 3.
FLOATNúmeros flutuantes, como 1,0, 2,0.
CONSTNúmeros inteiros ou números flutuantes.
IDENTIFICADORIdentificador. Em Milvus, o IDENTIFIER representa o nome do campo.
LogicalOpUm LogicalOp é um operador lógico que permite combinar mais do que uma operação relacional numa única comparação. O valor devolvido de uma LogicalOp é VERDADEIRO (1) ou FALSO (0). Existem dois tipos de LogicalOps, incluindo BinaryLogicalOps e UnaryLogicalOps.
UnaryLogicalOpUnaryLogicalOp refere-se ao operador lógico unário "not".
BinaryLogicalOpOperadores lógicos binários que executam acções em dois operandos. Numa expressão complexa com dois ou mais operandos, a ordem de avaliação depende das regras de precedência.
ArithmeticOpUm ArithmeticOp, nomeadamente um operador aritmético, efectua operações matemáticas como a adição e a subtração de operandos.
UnaryArithOpUm UnaryArithOp é um operador aritmético que efectua uma operação sobre um único operando. O UnaryArithOp negativo transforma uma expressão positiva numa negativa, ou o inverso.
BinaryArithOpUm BinaryArithOp, nomeadamente um operador binário, efectua operações sobre dois operandos. Numa expressão complexa com dois ou mais operandos, a ordem de avaliação depende das regras de precedência.
CmpOpCmpOp é um operador relacional que executa acções sobre dois operandos.
CmpOpRestrictedCmpOpRestricted é restrito a "Menor que" e "Igual".
ConstantExprConstantExpr pode ser uma constante ou um BinaryArithOp sobre duas ConstExprs ou um UnaryArithOp sobre uma única ConstantExpr. É definida recursivamente.
ConstantArrayConstantArray é envolvida por parênteses rectos, e ConstantExpr pode ser repetida entre parênteses rectos. ConstArray deve incluir pelo menos um ConstantExpr.
TermExprTermExpr é utilizado para verificar se o valor de um IDENTIFIER aparece numa ConstantArray. TermExpr é representado por "in".
CompareExprUma CompareExpr, ou seja, uma expressão de comparação, pode ser uma operação relacional sobre dois IDENTIFIERs, ou uma operação relacional sobre um IDENTIFIER e uma ConstantExpr, ou uma operação ternária sobre duas ConstantExprs e um IDENTIFIER.
SingleExprSingleExpr, ou seja, uma única expressão, pode ser uma TermExpr ou uma CompareExpr.
LogicalExprUma LogicalExpr pode ser uma BinaryLogicalOp sobre duas LogicalExprs, ou uma UnaryLogicalOp sobre uma única LogicalExpr, ou uma LogicalExpr agrupada entre parênteses, ou uma SingleExpr. O LogicalExpr é definido recursivamente.
ExprExpr, uma abreviatura que significa expressão, pode ser LogicalExpr ou NIL.
MatchOpUm MatchOp, nomeadamente um operador de correspondência, compara uma cadeia de caracteres com uma constante de cadeia de caracteres ou uma constante de prefixo, infixo ou sufixo de cadeia de caracteres.
JsonArrayOpUm JsonOp, nomeadamente um operador JSON, verifica se o identificador especificado contém os elementos especificados.
ArrayOpUm ArrayOp, ou seja, um operador de matriz, verifica se o identificador especificado contém os elementos especificados.

Operadores

Operadores lógicos

Os operadores lógicos efectuam uma comparação entre duas expressões.

SímboloOperaçãoExemplo de operaçãoDescrição
'e' &&eexpr1 && expr2Verdadeiro se ambas as expressões expr1 e expr2 forem verdadeiras.
'or' ||ouexpr1 || expr2Verdadeiro se expr1 ou expr2 forem verdadeiros.

Operadores aritméticos binários

Os operadores aritméticos binários contêm dois operandos e podem efetuar operações aritméticas básicas e devolver o resultado correspondente.

SímboloOperaçãoExemplo de operaçãoDescrição
+Adiçãoa + bAdiciona os dois operandos.
-Subtraçãoa - bSubtrair o segundo operando do primeiro operando.
*Multiplicaçãoa * bMultiplicar os dois operandos.
/Divisãoa / bDivide o primeiro operando pelo segundo operando.
**Potênciaa ** bElevar o primeiro operando à potência do segundo operando.
%Móduloa % bDivide o primeiro operando pelo segundo operando e produz a parte restante.

Operadores relacionais

Os operadores relacionais utilizam símbolos para verificar a igualdade, desigualdade ou ordem relativa entre duas expressões.

SímboloOperaçãoExemploDescrição
<Menor quea < bVerdadeiro se a for menor que b.
>Maior quea > bVerdadeiro se a for maior do que b.
==Iguala == bVerdadeiro se a for igual a b.
!=Não é iguala != bVerdadeiro se a não for igual a b.
<=Menor que ou iguala <= bVerdadeiro se a for menor ou igual a b.
>=Maior ou iguala >= bVerdadeiro se a for maior ou igual a b.

Precedência e associatividade dos operadores

A tabela seguinte indica a precedência e a associatividade dos operadores. Os operadores são listados de cima para baixo, em precedência decrescente.

PrecedênciaOperadorDescriçãoAssociatividade
1+ -UnárioArithOpDa esquerda para a direita
2nãoUnaryLogicOpDa direita para a esquerda
3**BinaryArithOpDa esquerda para a direita
4* / %BinárioArithOpDa esquerda para a direita
5+ -BinárioArithOpDa esquerda para a direita
6< <= > >=CmpOpDa esquerda para a direita
7== !=CmpOpDa esquerda para a direita
8like LIKEMatchOpDa esquerda para a direita
9json_contains JSON_CONTAINSJsonArrayOpDa esquerda para a direita
9array_contains ARRAY_CONTAINSArrayOpDa esquerda para a direita
10json_contains_all JSON_CONTAINS_ALLJsonArrayOpDa esquerda para a direita
10array_contains_all ARRAY_CONTAINS_ALLArrayOpDa esquerda para a direita
11json_contains_any JSON_CONTAINS_ANYJsonArrayOpDa esquerda para a direita
11array_contains_any ARRAY_CONTAINS_ANYArrayOpDa esquerda para a direita
12array_length ARRAY_LENGTHArrayOpDa esquerda para a direita
13&& eBinaryLogicOpDa esquerda para a direita
14|| ouBinaryLogicOpDa esquerda para a direita

As expressões são normalmente avaliadas da esquerda para a direita. As expressões complexas são avaliadas uma de cada vez. A ordem pela qual as expressões são avaliadas é determinada pela precedência dos operadores utilizados.

Se uma expressão contiver dois ou mais operadores com a mesma precedência, o operador à esquerda é avaliado primeiro.

Por exemplo, 10 / 2 * 5 será avaliado como (10 / 2) e o resultado multiplicado por 5.

Quando uma operação de precedência inferior deve ser processada em primeiro lugar, deve ser colocada entre parênteses.

Por exemplo, 30 / 2 + 8. Isto é normalmente avaliado como 30 dividido por 2 e depois 8 adicionado ao resultado. Se quiser dividir por 2 + 8, deve ser escrito como 30 / (2 + 8).

Os parênteses podem ser aninhados dentro de expressões. As expressões parentéticas mais internas são avaliadas primeiro.

Utilização

As amostras de todas as utilizações de expressões booleanas disponíveis no Milvus são apresentadas da seguinte forma (int64 representa o campo escalar que contém dados do tipo INT64, float representa o campo escalar que contém dados do tipo vírgula flutuante e VARCHAR representa o campo escalar que contém dados do tipo VARCHAR):

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

    Se a expressão JSON de uma instrução JSON_CONTAINS (o segundo argumento) for uma lista, o identificador (o primeiro argumento) deverá ser uma lista de listas. Caso contrário, a declaração é sempre avaliada 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)

    A expressão JSON numa declaração JSON_CONTAINS_ALL deve ser sempre uma 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)

    A expressão JSON numa declaração JSON_CONTAINS_ANY deve ser sempre uma lista. Caso contrário, actua da mesma forma 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)

    Se a expressão de matriz de uma declaração ARRAY_CONTAINS (o segundo argumento) for uma lista, o identificador (o primeiro argumento) deverá ser uma lista de listas. Caso contrário, a declaração é sempre avaliada como False.

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

    A expressão da matriz numa declaração ARRAY_CONTAINS_ALL deve ser sempre uma 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)

    A expressão de matriz numa declaração ARRAY_CONTAINS_ANY deve ser sempre uma lista. Caso contrário, actua da mesma forma 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)

    Verificar o número de elementos de uma matriz.

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

O que se segue

Agora que já sabe como funcionam os conjuntos de bits no Milvus, também pode querer:

Traduzido porDeepLogo

Try Zilliz Cloud for Free

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

Get Started
Feedback

Esta página foi útil?