JSONオペレータ
MilvusはJSONフィールドのクエリやフィルタリングのための高度な演算子をサポートしており、複雑な構造化データの管理に最適です。これらの演算子を使用すると、JSON ドキュメントを非常に効率的にクエリすることができ、JSON フィールド内の特定の要素、値、または条件に基づいてエンティティを取得することができます。このセクションでは、MilvusにおけるJSON固有の演算子の使用方法について、実用的な例を示しながら、その機能を説明します。
JSON フィールドは複雑な入れ子構造を扱うことができず、すべての入れ子構造をプレーンな文字列として扱います。そのため、JSONフィールドを扱う際には、過度に深い入れ子を避け、データ構造を可能な限りフラットにすることが最適なパフォーマンスを実現するために推奨されます。
利用可能なJSON演算子
Milvusは、JSONデータのフィルタリングやクエリに役立つ強力なJSON演算子をいくつか提供しています。
JSON_CONTAINS(identifier, expr)
:指定されたJSON式がフィールド内にあるエンティティをフィルタリングします。JSON_CONTAINS_ALL(identifier, expr)
:指定されたJSON式のすべての要素がフィールド内に存在することを確認します。JSON_CONTAINS_ANY(identifier, expr)
:JSON式の少なくとも1つのメンバがフィールド内に存在するエンティティをフィルタリングします。
これらの演算子が実際のシナリオでどのように適用されるか、例を挙げて調べてみましょう。
JSON_CONTAINS
json_contains
演算子は、JSON フィールド内に特定の要素またはサブ配列が存在するかどうかをチェックします。JSONの配列やオブジェクトに特定の値が含まれていることを確認したい場合に便利です。
例
["electronics", "sale", "new"]
のような文字列の JSON 配列を含むtags
フィールドを持つ商品のコレクションがあるとします。タグ"sale"
を持つ製品をフィルタリングしたいとします。
# JSON data: {"tags": ["electronics", "sale", "new"]}
filter = 'json_contains(tags, "sale")'
この例では、Milvusは、tags
フィールドが要素"sale"
を含むすべての製品を返します。
json_contains_all
json_contains_all
演算子は、指定されたJSON式のすべての要素が対象フィールドに存在することを保証します。これは、JSON配列内の複数の値にマッチする必要がある場合に特に便利です。
例
商品タグのシナリオを続けると、"electronics"
、"sale"
、"new"
のタグを持つすべての商品を検索する場合は、json_contains_all
演算子を使用できます。
# JSON data: {"tags": ["electronics", "sale", "new", "discount"]}
filter = 'json_contains_all(tags, ["electronics", "sale", "new"])'
このクエリは、tags
配列に指定した 3 つの要素すべてが含まれるすべての製品を返します:"electronics"
,"sale"
, および"new"
。
json_cotains_any
json_contains_any
演算子は、JSON 式の少なくとも 1 つのメンバがフィールド内に存在するエンティティをフィルタリングします。これは、複数の可能な値のいずれかに基づいてエンティティをマッチさせたい場合に便利です。
例
"electronics"
、"sale"
、"new"
のいずれかのタグを少なくとも1つ持つ製品をフィルタリングしたいとします。これを実現するには、json_contains_any
演算子を使用できます。
# JSON data: {"tags": ["electronics", "sale", "new"]}
filter = 'json_contains_any(tags, ["electronics", "new", "clearance"])'
この場合、Milvusはリスト["electronics", "new", "clearance"]
にあるタグのうち少なくとも1つを持つすべての商品を返します。これらのタグを1つしか持たない商品であっても、結果に含まれます。