基本演算子
Milvus には、データを効率的にフィルタリングおよびクエリ実行するための豊富な基本演算子が用意されています。これらの演算子を使用することで、スカラーフィールド、数値計算、論理条件などに基づいて検索条件を絞り込むことができます。これらの演算子の使い方を理解することは、正確なクエリを構築し、検索の効率を最大化するために不可欠です。
比較演算子
比較演算子は、等価、不等価、または値の大きさに基づいてデータをフィルタリングするために使用されます。これらは数値フィールドおよびテキストフィールドに適用可能です。
サポートされている比較演算子
==(等しい)!=(不等号)>(より大きい)<(より小さい)>=(以上)<=(以下)
例 1: 「等しい」によるフィルタリング (==)
「status 」というフィールドがあり、status が「active」であるすべてのエンティティを検索したいとします。等号演算子== を使用できます:
filter = 'status == "active"'
例 2: 「!= 」の不等号(≠)によるフィルタリング
status が「inactive」ではないエンティティを検索するには:
filter = 'status != "inactive"'
例 3: 「より大きい」条件(> )によるフィルタリング
age が30より大きいすべてのエンティティを検索するには:
filter = 'age > 30'
例 4: 「より小さい」条件でのフィルタリング
price が 100 未満のエンティティを検索するには:
filter = 'price < 100'
例 5: 「以上」(>= )によるフィルタリング
rating が4以上であるすべてのエンティティを検索する場合は:
filter = 'rating >= 4'
例 6: 「以下」によるフィルタリング
discount が10%以下のエンティティを検索するには:
filter = 'discount <= 10'
範囲演算子
範囲演算子は、特定の値のセットに基づいてデータをフィルタリングするのに役立ちます。Milvusでは、集合への所属確認にIN をサポートしています。
color が「red」、「green」、または「blue」のいずれかであるすべてのエンティティを検索する場合は、次のようにします:
filter = 'color in ["red", "green", "blue"]'
これは、値のリストへの所属を確認したい場合に役立ちます。
パターンマッチング演算子
パターンマッチング演算子は、ワイルドカードパターンや正規表現に基づいて文字列値をフィルタリングするのに役立ちます。
LIKE: 文字列値に対する単純なワイルドカードパターンに一致させるために使用します。たとえば、name LIKE "Prod%"は、Prodで始まる値に一致します。=~: 文字列値を RE2 正規表現と照合するために使用します。たとえば、code =~ "E[0-9]{4}"は、E1001のようなエラーコードを含む値に一致します。!~: RE2正規表現に一致する文字列値を除外するために使用します。これは、NOT (field =~ "pattern")と同等です。
name の先頭がProd で始まるエンティティを検索するには:
filter = 'name LIKE "Prod%"'
code にE1001 などのエラーコードが含まれるエンティティを検索するには:
filter = 'code =~ "E[0-9]{4}"'
message がDEBUG で始まるエンティティを除外するには:
filter = 'message !~ "^DEBUG"'
LIKE と正規表現の選択、サポートされるフィールドタイプ、正規表現の構文、エスケープ規則、およびパフォーマンスに関する詳細については、「パターンマッチング」を参照してください。Milvusでは、VARCHAR フィールドまたはJSON文字列パスに対してNGRAM インデックスを構築し、対象となるパターンマッチングフィルターを高速化することも可能です。詳細については、「NGRAM」を参照してください。
算術演算子
算術演算子を使用すると、数値フィールドを用いた計算に基づいた条件を作成できます。
サポートされている算術演算子
+(加算)-(減算)*(乗算)/(除算)%(剰余)**(累乗)
例 1: 剰余演算の使用 (%)
id が偶数(つまり、2 で割り切れる)となる要素を求めるには:
filter = 'id % 2 == 0'
例 2: 累乗の活用(** )
price の 2 乗が 1000 より大きいエンティティを検索するには:
filter = 'price ** 2 > 1000'
ビット演算子Compatible with Milvus 3.0.0+
ビット演算子は、整数フィールドが権限、機能フラグ、ステータスビットなど、複数のフラグをエンコードしている場合に役立ちます。フィルタ式でこれらの演算子を使用することで、整数値の個々のビットをチェック、結合、または比較することができます。
スカラーフィールドの場合、ビット演算子は、INT8 、INT16 、INT32 、INT64 などの整数フィールド型に適用されます。
サポートされているビット演算子
| 演算子 | 名前 | 代表的な用途 |
|---|---|---|
& | ビット単位の AND | 特定のビットがセットされているかどうかを確認します。 |
| | ビット単位のOR | 比較の前にビットを結合します。 |
^ | ビット単位のXOR | 2つの値のビットの違いを比較します。 |
例:権限ビットによるフィルタリング
permissions という名前の整数フィールドがあり、その整数の各ビットが権限フラグを表していると仮定します:
| アクセス権フラグ | ビット値 |
|---|---|
READ | 1 |
WRITE | 2 |
SHARE | 4 |
ADMIN | 8 |
たとえば、permissions = 5 の場合、5 = 1 + 4 であるため、READ およびSHARE のビットがセットされていることを意味します。
SHARE ビットが設定されているエンティティを検索するには、ビット単位のAND演算(& )を使用します:
filter = "(permissions & 4) == 4"
WRITE| ビットが設定された場合に の権限セットが生成されるエンティティを検索するには、ビット単位のAND演算( )を使用します:READ + WRITE + SHARE
filter = "(permissions | 2) == 7"
READ + WRITE + SHARE との違いがWRITE ビットのみであるエンティティを検索するには、ビット単位の XOR (^) を使用します:
filter = "(permissions ^ 7) == 2"
(permissions & 4) == 4 のように、結果を比較する前に、必ずビット演算を括弧で囲んでください。Milvus 3.0.0 では、フィルタ式において& 、| 、および^ がサポートされています。ビット単位の NOT (~) およびシフト演算子 (<< および>>) はサポートされていません。
論理演算子
論理演算子は、複数の条件をより複雑なフィルタ式に組み合わせるために使用されます。これには、AND 、OR 、およびNOT が含まれます。
サポートされている論理演算子
AND: 複数の条件を組み合わせ、それらがすべて真でなければならない。OR: 少なくとも1つが真である必要がある条件を組み合わせます。NOT: 条件を否定します。
例 1: `AND ` を使用して条件を組み合わせる
price が100より大きく、stock が50より大きいすべての商品を検索するには:
filter = 'price > 100 AND stock > 50'
例 2: `OR ` を使用して条件を組み合わせる
color が「red」または「blue」のいずれかであるすべての商品を検索するには:
filter = 'color == "red" OR color == "blue"'
例 3: `NOT ` を使用して条件を除外する
color が「green」でないすべての商品を検索するには:
filter = 'NOT color == "green"'
IS NULL および IS NOT NULL 演算子
IS NULL およびIS NOT NULL 演算子は、フィールドに NULL 値(データが存在しない状態)が含まれているかどうかに基づいてフィールドをフィルタリングするために使用されます。
IS NULL: 特定のフィールドにNULL値が含まれている(つまり、値が存在しないか未定義である)エンティティを特定します。IS NOT NULL: 特定のフィールドに null 以外の値が含まれているエンティティを特定します。つまり、そのフィールドには有効で定義済みの値があります。
これらの演算子は大文字と小文字を区別しないため、IS NULL やis null 、IS NOT NULL やis not null などを使用できます。
NULL値を含む通常のスカラーフィールド
Milvus では、文字列や数値などの通常のスカラーフィールドに対して、NULL 値を含むフィルタリングを行うことができます。
空の文字列 `"" ` は、`VARCHAR ` フィールドの null 値としては扱われません。
description フィールドがNULLであるエンティティを取得するには:
filter = 'description IS NULL'
description フィールドがNULLでないエンティティを取得するには:
filter = 'description IS NOT NULL'
description フィールドがNULLではなく、かつprice フィールドの値が10より大きいエンティティを取得するには:
filter = 'description IS NOT NULL AND price > 10'
null値を持つJSONフィールド
Milvus では、null 値を含む JSON フィールドを条件としてフィルタリングすることができます。JSON フィールドは、以下の場合に null として扱われます:
JSONオブジェクト全体が明示的にNone(null)に設定されている場合。例:
{"metadata": None}。JSONフィールド自体がエンティティから完全に欠落している場合。
JSON オブジェクト内の要素の一部(個々のキーなど)が null であっても、そのフィールドは null ではないとみなされます。たとえば、\{"metadata": \{"category": None, "price": 99.99}} の場合、category キーが null であっても、null として扱われることはありません。
Milvus が null 値を持つ JSON フィールドをどのように処理するかをさらに説明するために、JSON フィールドmetadata を含む以下のサンプルデータを考えてみましょう:
data = [
{
"metadata": {"category": "electronics", "price": 99.99, "brand": "BrandA"},
"pk": 1,
"embedding": [0.12, 0.34, 0.56]
},
{
"metadata": None, # Entire JSON object is null
"pk": 2,
"embedding": [0.56, 0.78, 0.90]
},
{ # JSON field `metadata` is completely missing
"pk": 3,
"embedding": [0.91, 0.18, 0.23]
},
{
"metadata": {"category": None, "price": 99.99, "brand": "BrandA"}, # Individual key value is null
"pk": 4,
"embedding": [0.56, 0.38, 0.21]
}
]
例 1: メタデータが null のエンティティを取得する
metadata フィールドが存在しないか、明示的に None に設定されているエンティティを検索するには:
filter = 'metadata IS NULL'
# Example output:
# data: [
# "{'metadata': None, 'pk': 2}",
# "{'metadata': None, 'pk': 3}"
# ]
例 2: メタデータが null ではないエンティティを取得する
metadata フィールドがnullではないエンティティを検索するには:
filter = 'metadata IS NOT NULL'
# Example output:
# data: [
# "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
# "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]
null 値を含む ARRAY フィールド
Milvus では、null 値を含む ARRAY フィールドに対するフィルタリングが可能です。ARRAY フィールドは、以下の場合に null として扱われます:
ARRAYフィールド全体が明示的にNone(null)に設定されている場合(例:
"tags": None)。エンティティから ARRAY フィールドが完全に欠落している場合。
ARRAYフィールドは、すべての要素が同じデータ型でなければならないため、部分的なNULL値を含むことはできません。詳細については、「Array Field」を参照してください。
Milvus が null 値を含む ARRAY フィールドをどのように処理するかをさらに説明するために、ARRAY フィールドtags を含む次のサンプルデータを考えてみましょう:
data = [
{
"tags": ["pop", "rock", "classic"],
"ratings": [5, 4, 3],
"pk": 1,
"embedding": [0.12, 0.34, 0.56]
},
{
"tags": None, # Entire ARRAY is null
"ratings": [4, 5],
"pk": 2,
"embedding": [0.78, 0.91, 0.23]
},
{ # The tags field is completely missing
"ratings": [9, 5],
"pk": 3,
"embedding": [0.18, 0.11, 0.23]
}
]
例 1: `tags` が `null` のエンティティを取得する
tags フィールドが存在しないか、明示的にNone に設定されているエンティティを取得するには:
filter = 'tags IS NULL'
# Example output:
# data: [
# "{'tags': None, 'ratings': [4, 5], 'embedding': [0.78, 0.91, 0.23], 'pk': 2}",
# "{'tags': None, 'ratings': [9, 5], 'embedding': [0.18, 0.11, 0.23], 'pk': 3}"
# ]
例 2: `tags` が null ではないエンティティを取得する
tags フィールドがnullでないエンティティを取得するには:
filter = 'tags IS NOT NULL'
# Example output:
# data: [
# "{'metadata': {'category': 'electronics', 'price': 99.99, 'brand': 'BrandA'}, 'pk': 1}",
# "{'metadata': {'category': None, 'price': 99.99, 'brand': 'BrandA'}, 'pk': 4}"
# ]
JSONおよびARRAYフィールドでの基本演算子の使用に関するヒント
Milvusの基本演算子は汎用性が高く、スカラーフィールドに適用できるだけでなく、JSONフィールドやARRAYフィールドのキーやインデックスに対しても効果的に使用できます。
たとえば、product フィールドにprice 、model 、tags といった複数のキーが含まれている場合、常にキーを直接参照してください:
filter = 'product["price"] > 1000'
記録された温度の配列のうち、最初の温度が特定の値を超えるレコードを検索するには、次のようにします:
filter = 'history_temperatures[0] > 30'
まとめ
Milvus には、データのフィルタリングやクエリ実行において柔軟性を発揮する、さまざまな基本演算子が用意されています。比較演算子、範囲演算子、算術演算子、論理演算子を組み合わせることで、強力なフィルタ式を作成し、検索結果を絞り込み、必要なデータを効率的に取得することができます。
よくある質問
フィルタ条件における一致値リストの長さに制限はありますか(例:filter=’color in ["red", "green", “blue”]’)?リストが長すぎる場合はどうすればよいですか?
Zilliz Cloud では、フィルタ条件における一致値リストの長さに制限を設けていません。ただし、リストが過度に長いと、クエリのパフォーマンスに大きな影響を与える可能性があります。 フィルタ条件に長い一致値リストや、多くの要素を含む複雑な式が含まれている場合は、クエリのパフォーマンスを向上させるために「フィルタテンプレート」の使用をお勧めします。