スカラー・フィルタリング・ルール
概要
述語式はブール値を出力します。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 | 整数または浮動小数点数。 |
IDENTIFIER | 識別子。MilvusではIDENTIFIERはフィールド名を表す。 |
論理演算子 | LogicalOp は論理演算子で、1回の比較で複数の関係演算を組み合わせることができます。LogicalOp の戻り値は TRUE (1) または FALSE (0) です。LogicalOp には、BinaryLogicalOp と UnaryLogicalOp の 2 つのタイプがあります。 |
UnaryLogicalOp | UnaryLogicalOp は、単項論理演算子 "not" を指します。 |
BinaryLogicalOp (バイナリ論理演算子) | 2 つのオペランドに対してアクションを実行する二項論理演算子。2 つ以上のオペランドを持つ複雑な式では、評価の順序は優先順位ルールに依存します。 |
算術演算子 | ArithmeticOp (算術演算子) は、オペランドに対して加算や減算などの数学演算を実行します。 |
UnaryArithOp | UnaryArithOp は、単一のオペランドに対して演算を実行する算術演算子です。負の UnaryArithOp は、正の式を負の式に変更します。 |
BinaryArithOp | BinaryArithOp は二項演算子で、2 つのオペランドに対して演算を行います。2つ以上のオペランドを持つ複雑な式では、評価の順序は優先順位規則に依存します。 |
CmpOp | CmpOp は、2 つのオペランドに対して処理を実行する関係演算子です。 |
CmpOpRestricted | CmpOpRestricted は、"Less than" および "Equal" に制限されています。 |
ConstantExpr | ConstantExprは、定数、2つのConstExpr上のBinaryArithOp、または1つのConstantExpr上のUnaryArithOpになります。再帰的に定義されます。 |
ConstantArray | ConstantArrayは角括弧で囲まれ、ConstantExprは角括弧の中で繰り返すことができます。ConstArrayは、少なくとも1つのConstantExprを含まなければなりません。 |
TermExpr | TermExprは、IDENTIFIERの値がConstantArrayに含まれるかどうかをチェックするために使用されます。TermExprは "in "で表されます。 |
CompareExpr | CompareExpr、つまり比較式は、2つのIDENTIFIERに対する関係演算、1つのIDENTIFIERと1つのConstantExprに対する関係演算、2つのConstantExprと1つのIDENTIFIERに対する3項演算になります。 |
SingleExpr | SingleExpr、つまり単一の式は、TermExprまたは CompareExprのいずれかになります。 |
LogicalExpr | LogicalExpr は、2 つの LogicalExpr 上の BinaryLogicalOp、1 つの LogicalExpr 上の UnaryLogicalOp、括弧内にグループ化された LogicalExpr、または SingleExpr のいずれかです。LogicalExpr は再帰的に定義されます。 |
Expr | Expr は式を意味する略語で、LogicalExpr または NIL を指定できます。 |
MatchOp | MatchOp、つまりマッチ演算子は、文字列と文字列定数、または文字列の接頭辞、接尾辞、接尾辞定数を比較します。 |
JsonArrayOp | JsonOp (JSON 演算子) は、指定された識別子が指定された要素を含むかどうかをチェックします。 |
ArrayOp | ArrayOp(配列演算子)は、指定された識別子が指定された要素を含むかどうかをチェックします。 |
演算子
論理演算子
論理演算子は、2 つの式の比較を行います。
記号 | 演算子 | 例 | 論理演算子 |
---|---|---|---|
および | と | expr1 && expr2 | expr1 と expr2 の両方が真なら真。 |
または | または | expr1 || expr2 | expr1 と expr2 のどちらかが真なら真。 |
二項演算子
二項演算子は 2 つのオペランドを含み、基本的な算術演算を実行し、対応する結果を返します。
記号 | 演算 | 例 | 説明 |
---|---|---|---|
+ | 加算 | a + b | 2つのオペランドを加算します。 |
- | 減算 | a - b | 最初のオペランドから2番目のオペランドを引く。 |
* | 乗算 | a * b | 2つのオペランドを乗算する。 |
/ | 除算 | a / b | 最初のオペランドを2番目のオペランドで割る。 |
** | べき乗 | a ** b | 最初のオペランドを 2 番目のオペランドのべき乗にします。 |
% | モジュロ | a % b | 第 1 オペランドを第 2 オペランドで割り、余り部分を返す。 |
関係演算子
関係演算子は記号を使用して、2 つの式の間の等式、不等式、相対順序をチェックします。
記号 | 演算 | 例 | 説明 |
---|---|---|---|
< | 未満 | 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 | + - | 単項演算子 | 左から右 |
2 | でない | ユナリオロジック | 右から左 |
3 | ** | バイナリ | 左から右 |
4 | * / % | バイナリ | 左から右 |
5 | + - | バイナリ | 左から右 |
6 | < <= > >= | CmpOp | 左から右 |
7 | == != | CmpOp | 左から右 |
8 | LIKEのような | マッチオプ | 左から右 |
9 | JSON_CONTAINS JSON_CONTAINS | JsonArrayOp | 左から右 |
9 | array_containsはARRAY_CONTAINSを含みます。 | ArrayOp | 左から右 |
10 | JSON_CONTAINS_ALL JSON_CONTAINS_ALL | JsonArrayOp。 | 左から右 |
10 | 配列をすべて含む ARRAY_CONTAINS_ALL | ArrayOp | 左から右 |
11 | JSON_CONTAINS_ANY JSON_CONTAINS_ANY | JsonArrayOp | 左から右 |
11 | array_contains_any ARRAY_CONTAINS_ANY | ArrayOp | 左から右 |
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型のデータを含むスカラーフィールドを表す):
- CmpOp
"int64 > 0"
"0 < int64 < 400"
"500 <= int64 < 1000"
VARCHAR > "str1"
- BinaryLogicalOpと括弧
"(int64 > 0 && int64 < 400) or (int64 > 500 && int64 < 1000)"
- TermExpr および UnaryLogicOp
"int64 not in [1, 2, 3]"
VARCHAR not in ["str1", "str2"]
- TermExpr、BinaryLogicalOp、および CmpOp(異なるフィールド上)
"int64 in [1, 2, 3] and float != 2"
- BinaryLogicalOp および CmpOp
"int64 == 0 || int64 == 1 || int64 == 2"
- CmpOp および UnaryArithOp または BinaryArithOp
"200+300 < int64 <= 500+500"
- MatchOp
VARCHAR like "prefix%"
VARCHAR like "%suffix"
VARCHAR like "%middle%"
VARCHAR like "_suffix"
- 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
- 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でビットセットがどのように機能するかがわかったところで、次のこともやってみましょう:
- ハイブリッド検索の方法
- 文字列を使って検索結果をフィルタリングする方法を学ぶ。
- ブーリアン式の構築におけるダイナミックフィールドの使用方法を学ぶ。