milvus-logo
LFAI
フロントページへ
  • ユーザーガイド

スカラー・フィルタリング・ルール

概要

述語式はブール値を出力します。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空。式は空文字列でもよい。
INTEGER1、2、3などの整数。
FLOAT1.0、2.0などの浮動小数点数。
CONST整数または浮動小数点数。
IDENTIFIER識別子。MilvusではIDENTIFIERはフィールド名を表す。
論理演算子LogicalOp は論理演算子で、1回の比較で複数の関係演算を組み合わせることができます。LogicalOp の戻り値は TRUE (1) または FALSE (0) です。LogicalOp には、BinaryLogicalOp と UnaryLogicalOp の 2 つのタイプがあります。
UnaryLogicalOpUnaryLogicalOp は、単項論理演算子 "not" を指します。
BinaryLogicalOp (バイナリ論理演算子)2 つのオペランドに対してアクションを実行する二項論理演算子。2 つ以上のオペランドを持つ複雑な式では、評価の順序は優先順位ルールに依存します。
算術演算子ArithmeticOp (算術演算子) は、オペランドに対して加算や減算などの数学演算を実行します。
UnaryArithOpUnaryArithOp は、単一のオペランドに対して演算を実行する算術演算子です。負の UnaryArithOp は、正の式を負の式に変更します。
BinaryArithOpBinaryArithOp は二項演算子で、2 つのオペランドに対して演算を行います。2つ以上のオペランドを持つ複雑な式では、評価の順序は優先順位規則に依存します。
CmpOpCmpOp は、2 つのオペランドに対して処理を実行する関係演算子です。
CmpOpRestrictedCmpOpRestricted は、"Less than" および "Equal" に制限されています。
ConstantExprConstantExprは、定数、2つのConstExpr上のBinaryArithOp、または1つのConstantExpr上のUnaryArithOpになります。再帰的に定義されます。
ConstantArrayConstantArrayは角括弧で囲まれ、ConstantExprは角括弧の中で繰り返すことができます。ConstArrayは、少なくとも1つのConstantExprを含まなければなりません。
TermExprTermExprは、IDENTIFIERの値がConstantArrayに含まれるかどうかをチェックするために使用されます。TermExprは "in "で表されます。
CompareExprCompareExpr、つまり比較式は、2つのIDENTIFIERに対する関係演算、1つのIDENTIFIERと1つのConstantExprに対する関係演算、2つのConstantExprと1つのIDENTIFIERに対する3項演算になります。
SingleExprSingleExpr、つまり単一の式は、TermExprまたは CompareExprのいずれかになります。
LogicalExprLogicalExpr は、2 つの LogicalExpr 上の BinaryLogicalOp、1 つの LogicalExpr 上の UnaryLogicalOp、括弧内にグループ化された LogicalExpr、または SingleExpr のいずれかです。LogicalExpr は再帰的に定義されます。
ExprExpr は式を意味する略語で、LogicalExpr または NIL を指定できます。
MatchOpMatchOp、つまりマッチ演算子は、文字列と文字列定数、または文字列の接頭辞、接尾辞、接尾辞定数を比較します。
JsonArrayOpJsonOp (JSON 演算子) は、指定された識別子が指定された要素を含むかどうかをチェックします。
ArrayOpArrayOp(配列演算子)は、指定された識別子が指定された要素を含むかどうかをチェックします。

演算子

論理演算子

論理演算子は、2 つの式の比較を行います。

記号演算子論理演算子
およびexpr1 && expr2expr1 と expr2 の両方が真なら真。
またはまたはexpr1 || expr2expr1 と expr2 のどちらかが真なら真。

二項演算子

二項演算子は 2 つのオペランドを含み、基本的な算術演算を実行し、対応する結果を返します。

記号演算説明
+加算a + b2つのオペランドを加算します。
-減算a - b最初のオペランドから2番目のオペランドを引く。
*乗算a * b2つのオペランドを乗算する。
/除算a / b最初のオペランドを2番目のオペランドで割る。
**べき乗a ** b最初のオペランドを 2 番目のオペランドのべき乗にします。
%モジュロa % b第 1 オペランドを第 2 オペランドで割り、余り部分を返す。

関係演算子

関係演算子は記号を使用して、2 つの式の間の等式、不等式、相対順序をチェックします。

記号演算説明
<未満a < ba が b より小さい場合に真。
>より大きいa > baがbより大きければ真。
==等しいa == ba が b と等しければ真。
!=等しくないa != baがbと等しくない場合に真。
<=以下または等しいa <= baがb以下であれば真。
>=より大きいか等しいa >= ba が b より大きいか等しい場合に真。

演算子の優先順位と連想度

次の表は、演算子の優先順位と連想度の一覧である。演算子は上から下へ、優先順位の高い順に並んでいます。

優先順位演算子説明連想度
1+ -単項演算子左から右
2でないユナリオロジック右から左
3**バイナリ左から右
4* / %バイナリ左から右
5+ -バイナリ左から右
6< <= > >=CmpOp左から右
7== !=CmpOp左から右
8LIKEのようなマッチオプ左から右
9JSON_CONTAINS JSON_CONTAINSJsonArrayOp左から右
9array_containsはARRAY_CONTAINSを含みます。ArrayOp左から右
10JSON_CONTAINS_ALL JSON_CONTAINS_ALLJsonArrayOp。左から右
10配列をすべて含む ARRAY_CONTAINS_ALLArrayOp左から右
11JSON_CONTAINS_ANY JSON_CONTAINS_ANYJsonArrayOp左から右
11array_contains_any ARRAY_CONTAINS_ANYArrayOp左から右
12配列の長さ ARRAY_LENGTH配列オープン左から右
13バイナリロジック左から右
14|| またはバイナリロジック左から右

式は通常左から右に評価される。複雑な式は1つずつ評価される。式を評価する順序は、使用する演算子の優先順位によって決まります。

式に同じ優先順位の演算子が2つ以上含まれる場合は、左側の演算子が最初に評価されます。

たとえば、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_CONTAINS (第2引数)ステートメントのJSON式がリストの場合、識別子(第1引数)はリストのリストでなければなりません。そうでない場合、ステートメントは常に 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_CONTAINS_ALL ステートメントの JSON 式は、常にリストでなければなりません。

    # {"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_CONTAINS_ANY 、JSON式は常にリストでなければならない。そうでない場合は、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 (第2引数)文の配列式がリストの場合、識別子(第1引数)はリストのリストでなければならない。そうでない場合、文は常に 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でビットセットがどのように機能するかがわかったところで、次のこともやってみましょう:

翻訳DeepLogo

Try Managed Milvus for Free

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

Get Started
フィードバック

このページは役に立ちましたか ?