ブール式の規則

この章では、クエリ条件式の書き方について紹介します。

概要

述語式はブール値を出力します。Milvusは述語を使用してスカラーをフィルタリングします。述語式を評価すると、TRUE または FALSE が返ります。述語式の使用方法については、Python SDK API リファレンスを参照してください。

演算子

論理演算子

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

シンボル 操作 説明
'and' && AND expr1 && expr2 expr1 と expr2 が両方とも true の場合、True を返します。
'or' || OR expr1 || expr2 expr1 または expr2 のどちらかが true の場合、True を返します。

二項演算子

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

シンボル 操作 説明
+ 加算 a + b 2つのオペランドを加算します。
- 減算 a - b 第2オペランドを第1オペランドから減算します。
* 乗算 a * b 2つのオペランドを乗算します。
/ 除算 a / b 第1オペランドを第2オペランドで除算します。
** 累乗 a ** b 第1オペランドを第2乗します。
% 剰余 a % b 第1オペランドを第2オペランドで除した余りを返します。

関係演算子

関係演算子は、2つの式の間の等価性、不等価性、または相対的な順序を確認するために記号を使用します。

シンボル 操作 説明
< より小さい a < b a が b より小さい場合、True を返します。
> より大きい a > b a が b より大きい場合、True を返します。
== 等しい a == b a が b と等しい場合、True を返します。
!= 等しくない a != b a が b と等しくない場合、True を返します。
<= 以下 a <= b a が b 以下の場合、True を返します。
>= 以上 a >= b a が b 以上の場合、True を返します。

演算子の優先順位と結合性

次の表は、演算子の優先順位と結合性を示しています。演算子は、上から下に優先順位順にリストされています。

優先順位 演算子 説明 結合性
1 + - 単項算術演算子 左から右へ
2 not 単項論理演算子 右から左へ
3 ** 二項算術演算子 左から右へ
4 * / % 二項算術演算子 左から右へ
5 + - 二項算術演算子 左から右へ
6 < <= > >= 比較演算子 左から右へ
7 == != 比較演算子 左から右へ
8 like LIKE マッチ演算子 左から右へ
9 json_contains JSON_CONTAINS JsonArray演算子 左から右へ
10 json_contains_all JSON_CONTAINS_ALL JsonArray演算子 左から右へ
11 json_contains_any JSON_CONTAINS_ANY JsonArray演算子 左から右へ
12 && and 二項論理演算子 左から右へ
13 || or 二項論理演算子 左から右へ

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

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

例えば、10 / 2 * 5 は (10 / 2) と評価され、その結果に 5 が乗算されます。

低い優先順位の操作を優先する必要がある場合は、それらを括弧で囲む必要があります。

例えば、30 / 2 + 8 です。通常は 30 を 2 で割り、その後 8 を結果に加えます。2 で割ってから 8 を加えたい場合は、30 / (2 + 8) と記述する必要があります。

括弧は式内でネストすることができます。最も内側の括弧が最初に評価されます。

Example conditions

以下は、Milvusで利用可能なすべてのブール式の例です(int64はINT64型データを含むスカラーフィールドを表し、floatは浮動小数点型データを含むスカラーフィールドを表し、VARCHARはVARCHAR型データを含むスカラーフィールドを表します):

  1. 比較式
"int64 > 0"
"0 < int64 < 400"
"500 < int64"
VARCHAR > "str1"
  1. 論理演算と括弧
"(int64 > 0 && int64 < 400) or (int64 > 500 && int64 < 1000)"
  1. in式

Milvusでは、明示的に定義された主キーを持つエンティティの削除のみをサポートしており、これは in 条件式を通じてのみ実現できます。

"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"
  1. MatchOp(接頭辞マッチング)
VARCHAR like "prefix%"
  1. JsonArrayOp
  • JSON_CONTAINS(identifier, JsonExpr)

    JSON_CONTAINS(2番目のパラメータ)ステートメントにあるJSON式がリストの場合、identifier(第1パラメータ)はリストのリストである必要があります。それ以外の場合、ステートメントは常にFalseに評価されます。

json_contains(x, 1) # ==> true
json_contains(x, "a") # ==> false

json_contains(x, [1,2,3]) # ==> true
json_contains(x, [3,2,1]) # ==> false
  • JSON_CONTAINS_ALL(identifier, JsonExpr)

    JSON_CONTAINS_ALLステートメントにあるJSON式は常にリストである必要があります。

json_contains_all(x, [1,2,8]) # ==> true
json_contains_all(x, [4,5,6]) # ==> false (6は存在しない)
  • JSON_CONTAINS_ANY(identifier, JsonExpr)

    JSON_CONTAINS_ANYステートメントにあるJSON式は常にリストである必要があります。それ以外の場合、その動作はJSON_CONTAINSと同じです。

json_contains_any(x, [1,2,8]) # ==> true
json_contains_any(x, [4,5,6]) # ==> true
json_contains_any(x, [6,9]) # ==> false