ARRAY演算子
Milvus には、ARRAY フィールドのフィルタリングや ARRAY フィールド値の部分的な更新を行うための ARRAY 演算子が用意されています。
配列内のすべての要素は同じ型でなければならず、配列内のネストされた構造体は単純な文字列として扱われます。したがって、ARRAYフィールドを扱う際は、過度なネストを避け、最適なパフォーマンスを得るためにデータ構造をできるだけフラットに保つことをお勧めします。
Milvus の ARRAY 演算子は、次の 2 つの使用シナリオに対応しています。
クエリおよび検索のためのフィルタ式。
upsertリクエストにおける部分更新。
利用可能なARRAY演算子
以下の表は、Milvusで利用可能なARRAY演算子の一覧です。
| 演算子 | 使用場所 | 説明 |
|---|---|---|
| ARRAY_CONTAINS(識別子, 式) | フィルタ式 | ARRAY フィールドに特定の要素が存在するかどうかを確認します。 |
| ARRAY_CONTAINS_ALL(識別子, 式) | フィルタ式 | 指定されたリスト内のすべての要素が ARRAY フィールドに存在するかどうかを調べます。 |
| ARRAY_CONTAINS_ANY(識別子, 式) | フィルタ式 | 指定されたリスト内のいずれかの要素が ARRAY フィールドに存在するかどうかを調べます。 |
| ARRAY_LENGTH(識別子) | フィルタ式 | ARRAY フィールド内の要素数を返し、フィルタリングのために比較演算子と組み合わせることができます。 |
| ARRAY_APPEND | upsert withfield_ops | 既存のARRAYフィールドにペイロード要素を追加します。Milvus v2.6.17以降で利用可能です。 |
| ARRAY_REMOVE | upsert とfield_ops | リクエストペイロード内の値と一致する要素を、既存のARRAYフィールドからすべて削除します。Milvus v2.6.17以降で利用可能です。 |
ARRAY_CONTAINS
ARRAY_CONTAINS 演算子は、配列フィールドに特定の要素が存在するかどうかを確認します。配列内に指定された要素が含まれるエンティティを検索したい場合に役立ちます。
例
history_temperatures という配列フィールドがあり、そこに各年の観測最低気温が格納されているとします。この配列に値「23 」が含まれるすべてのエンティティを検索するには、次のフィルタ式を使用できます。
filter = 'ARRAY_CONTAINS(history_temperatures, 23)'
これにより、history_temperatures 配列に23 という値が含まれるすべてのエンティティが返されます。
ARRAY_CONTAINS_ALL
ARRAY_CONTAINS_ALL 演算子は、指定されたリストのすべての要素が配列フィールドに含まれていることを保証します。この演算子は、配列に複数の値を含むエンティティを照合したい場合に役立ちます。
例
history_temperatures 配列に23 と24 の両方が含まれるすべてのエンティティを検索するには、次のようにします。
filter = 'ARRAY_CONTAINS_ALL(history_temperatures, [23, 24])'
これにより、history_temperatures 配列に指定された両方の値が含まれているすべてのエンティティが返されます。
ARRAY_CONTAINS_ANY
ARRAY_CONTAINS_ANY 演算子は、指定されたリストの要素のいずれかが配列フィールドに含まれているかどうかを確認します。これは、配列内の指定された値のうち少なくとも1つを含むエンティティを照合したい場合に役立ちます。
例
history_temperatures 配列に23 または24 のいずれかが含まれるすべてのエンティティを検索するには、次のようにします:
filter = 'ARRAY_CONTAINS_ANY(history_temperatures, [23, 24])'
これにより、history_temperatures 配列に23 または24 のいずれか1つ以上が含まれるすべてのエンティティが返されます。
ARRAY_LENGTH
ARRAY_LENGTH は、配列フィールドの長さ(要素数)を返します。この関数は、配列フィールドの識別子という、ちょうど1つのパラメータを受け取ります。
例
history_temperatures 配列の要素数が10未満であるすべてのエンティティを検索するには:
filter = 'ARRAY_LENGTH(history_temperatures) < 10'
これにより、history_temperatures 配列の要素数が10未満であるすべてのエンティティが返されます。
ARRAY_APPENDCompatible with Milvus 2.6.17+
ARRAY_APPEND 演算子は、upsert リクエスト中に、既存のARRAYフィールドにペイロード要素を追加します。これはフィルタ式ではありません。現在の配列値を事前に照会せずに配列に値を追加したい場合に使用します。
次の Python の例は、プライマリキーが `1` であるエンティティの `tags ` ARRAY フィールドに `"premium" ` を追加するものです。
from pymilvus import FieldOp, MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
client.upsert(
collection_name="users",
data=[{"pk": 1, "tags": ["premium"]}],
field_ops={"tags": FieldOp.array_append()},
)
field_ops を通じてフィールドにARRAY_APPEND を添付することで、そのフィールドに対して部分更新のセマンティクスが有効になります。完全なワークフロー、サポートされている要素タイプ、および制限については、「マージモードでの ARRAY フィールドのアップサート」を参照してください。
ARRAY_REMOVECompatible with Milvus 2.6.17+
ARRAY_REMOVE 演算子は、upsert リクエスト中に、リクエストペイロード内の値と一致する既存のARRAYフィールドからすべての要素を削除します。これはフィルタ式ではありません。現在の配列値を事前にクエリすることなく、配列から一致する値を削除したい場合に使用します。
次の Python の例は、プライマリキーが1 であるエンティティのtags ARRAY フィールドから、"trial" を削除します:
from pymilvus import FieldOp, MilvusClient
client = MilvusClient(
uri="http://localhost:19530",
token="root:Milvus"
)
client.upsert(
collection_name="users",
data=[{"pk": 1, "tags": ["trial"]}],
field_ops={"tags": FieldOp.array_remove()},
)
field_ops を通じてフィールドに `ARRAY_REMOVE ` を添付すると、そのフィールドに対して部分更新のセマンティクスが有効になります。完全なワークフロー、サポートされている要素タイプ、および制限については、「マージモードでの Upsert ARRAY フィールド」を参照してください。