基本演算子

Milvusはデータのフィルタリングやクエリを効率的に行うための豊富な基本演算子を提供しています。これらの演算子を使用すると、スカラーフィールド、数値計算、論理条件などに基づいて検索条件を絞り込むことができます。これらの演算子の使い方を理解することは、正確なクエリを構築し、検索の効率を最大限に高めるために非常に重要です。

比較演算子

比較演算子は、等式、不等式、またはサイズに基づいてデータをフィルタリングするために使用されます。数値フィールドとテキストフィールドに適用できます。

サポートされている比較演算子

  • == (等しい)

  • != (等しくない)

  • > (より大きい)

  • < (より小さい)

  • >= (大以上)

  • <= 以下

例 1:Equal To (==) によるフィルタリング

status というフィールドがあり、status が "active" であるすべてのエンティティを検索したいとします。等号演算子== を使用できます:

filter = 'status == "active"'

例 2:Not Equal To (!=) を使ったフィルタリング

status が「非アクティブ」でないエンティティを見つける:

filter = 'status != "inactive"'

例 3:Greater Than (>) によるフィルタリング

age が 30 より大きいエンティティをすべて検索する場合:

filter = 'age > 30'

例 4: 小を使ったフィルタリング

price が 100 未満のエンティティを検索する場合:

filter = 'price < 100'

例 5:Greater Than または Equal To (>=) によるフィルタリング

rating が 4 以上のエンティティをすべて検索する場合:

filter = 'rating >= 4'

例 6:以下でのフィルタリング

discount が 10% 以下のエンティティを検索する場合:

filter = 'discount <= 10'

範囲演算子

範囲演算子は、特定の値の集合または範囲に基づいてデータをフィルタリングするのに役立ちます。

サポートされている範囲演算子:

  • IN:特定のセットまたは範囲内の値をマッチさせるために使用されます。

  • LIKE:パターンにマッチさせるために使用されます(主にテキストフィールドの場合)。 Milvusでは、テキストクエリを高速化するために、VARCHARまたはJSONフィールドにNGRAM インデックスを構築することができます。詳細はNGRAMを参照してください。

例 1:IN を使用して複数の値に一致させる

color が "red"、"green"、"blue" のいずれかのエンティティをすべて検索したい場合:

filter = 'color in ["red", "green", "blue"]'

これは、値のリスト内のメンバシップを調べたい場合に便利である。

例 2:LIKE を使ったパターンマッチング

LIKE 演算子は文字列フィールドのパターンマッチングに使われます。この演算子は、プレフィックスインフィックスサフィックスなど、テキスト内のさまざまな位置の部分文字列にマッチさせることができます。LIKE 演算子は% シンボルをワイルドカードとして使い、 任意の数の文字(ゼロを含む)にマッチさせることができます。

ほとんどの場合、接尾辞マッチングや接尾辞マッチングは接頭辞マッチングよりも大幅に遅くなります。パフォーマンスを重視する場合は注意して使用してください。

プレフィックスマッチ (Starts With)

文字列が指定したパターンで始まるようなプレフィックスマッチを行うには、 パターンを先頭に置き、% を使ってそれに続く文字にマッチさせます。たとえば、name が "Prod" で始まるすべての製品を検索する場合:

filter = 'name LIKE "Prod%"'

これは、"Product A"、"Product B "など、商品名が "Prod "で始まるすべての商品にマッチします。

接尾辞マッチ(End With)

文字列が指定されたパターンで終わる接尾辞マッチの場合、% シンボルをパターンの先頭に置きます。例えば、name が "XYZ" で終わるすべての製品を検索する場合:

filter = 'name LIKE "%XYZ"'

この場合、"ProductXYZ"、"SampleXYZ "など、製品名が "XYZ "で終わるすべての製品にマッチします。

接尾辞マッチ(含む)

文字列のどこにでもパターンが出現するようなinfixマッチを行うには、% シンボルをパターンの最初と最後の両方に置きます。たとえば、name に "Pro" という単語が含まれるすべての製品を検索します:

filter = 'name LIKE "%Pro%"'

これは、"Product"、"ProLine"、"SuperPro "など、製品名に "Pro "という部分文字列が含まれるすべての製品にマッチします。

算術演算子

算術演算子を使用すると、数値フィールドを含む計算に基づいて条件を作成できます。

サポートされる算術演算子

  • + (加算)

  • - (減算)

  • * (乗算)

  • / (除算)

  • % (モジュラス)

  • ** 指数

例 1:モジュラス (%) の使用

id が偶数(つまり2で割り切れる)である実体を見つける:

filter = 'id % 2 == 0'

例 2: 指数を使う (**)

price の 2 乗が 1000 より大きいエンティティを見つける:

filter = 'price ** 2 > 1000'

論理演算子

論理演算子は、複数の条件を組み合わせて、より複雑なフィルタ式にするために使用します。これにはANDOR 、およびNOT が含まれます。

サポートされている論理演算子

  • AND:すべて真でなければならない複数の条件を組み合わせます。

  • OR:少なくとも1つが真でなければならない条件を組み合わせる。

  • NOT:条件を否定する。

例 1:AND を使って条件を組み合わせる

price が 100 より大きく、stock が 50 より大きい製品をすべて見つける:

filter = 'price > 100 AND stock > 50'

例 2:OR を使って条件を組み合わせる

color が「赤」または「青」であるすべての製品を検索する:

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:特定のフィールドにヌル以外の値が含まれているエンティティを識別します。

演算子は大文字と小文字を区別しないので、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とみなされる。例えば、category のキーがNULLであっても、\{"metadata": \{"category": None, "price": 99.99}} は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として扱われます:

  • 例えば、"tags": None のように、ARRAYフィールド全体が明示的にNone(Null)に設定されている場合。

  • ARRAYフィールドがエンティティから完全に欠落している。

ARRAY フィールドのすべての要素が同じデータ型でなければならないため、ARRAY フィールドに部分的な NULL 値を含めることはできません。詳細は配列フィールドを参照してください。

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:タグが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フィールドのキーやインデックスにも効果的に使用することができます。

例えば、price,model,tags のような複数のキーを含むproduct フィールドがある場合、常にキーを直接参照します:

filter = 'product["price"] > 1000'

記録された気温の配列の最初の気温が特定の値を超えているレコードを検索するには、次のように使用する:

filter = 'history_temperatures[0] > 30'

結論

Milvusには基本的な演算子が揃っており、データのフィルタリングやクエリを柔軟に行うことができます。比較演算子、範囲演算子、算術演算子、論理演算子を組み合わせることで、検索結果を絞り込み、必要なデータを効率的に取得するための強力なフィルタ式を作成することができます。

よくある質問

フィルタ条件(例えば、filter='color in ["red", "green", "blue"]')のマッチ値リストの長さに制限はありますか?リストが長すぎる場合はどうすればいいですか?

Zilliz Cloudでは、フィルター条件のマッチ値リストに長さの制限は設けておりません。しかし、長すぎるリストは、クエリのパフォーマンスに大きな影響を与える可能性があります。 フィルタ条件に長いマッチ値のリストや多くの要素を含む複雑な式が含まれる場合は、クエリのパフォーマンスを向上させるためにフィルタテンプレートを使用することをお勧めします。