Reputation: 54
I am using pymilvus version: 2.4.4
When trying to re-produce the code in documentations for advanced filtering on array fields https://milvus.io/docs/array_data_type.md#Advanced-filtering:
collection_name="test_collection",
filter="ARRAY_CONTAINS_ANY(color_coord, [7, 8, 9])",
output_fields=["id", "color", "color_tag", "color_coord"],
limit=3
)
It gives the following error:
MilvusException: <MilvusException: (code=1100, message=Invalid expr: ARRAY_CONTAINS_ANY(color_coord, [7, 8, 9]): invalid parameter)>
So, how to perform this operation correctly?
Upvotes: 0
Views: 76
Reputation:
Did you have the full source code in there?
I just ran this successfully
import random, time
from pymilvus import MilvusClient, DataType
CLUSTER_ENDPOINT = "http://192.168.1.153:19530"
# 1. Set up a Milvus client
client = MilvusClient(
uri=CLUSTER_ENDPOINT
)
# 2. Create a collection
schema = MilvusClient.create_schema(
auto_id=False,
enable_dynamic_field=False,
)
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)
schema.add_field(field_name="color", datatype=DataType.VARCHAR, max_length=512)
schema.add_field(field_name="color_tag", datatype=DataType.INT64)
schema.add_field(field_name="color_coord", datatype=DataType.ARRAY, element_type=DataType.INT64, max_capacity=5)
index_params = MilvusClient.prepare_index_params()
index_params.add_index(
field_name="id",
index_type="STL_SORT"
)
index_params.add_index(
field_name="vector",
index_type="IVF_FLAT",
metric_type="L2",
params={"nlist": 1024}
)
client.create_collection(
collection_name="test_collection",
schema=schema,
index_params=index_params
)
res = client.get_load_state(
collection_name="test_collection"
)
print(res)
res = client.query(
collection_name="test_collection",
filter="ARRAY_CONTAINS(color_coord, 10)",
output_fields=["id", "color", "color_tag", "color_coord"],
limit=3
)
print(res)
colors = ["green", "blue", "yellow", "red", "black", "white", "purple", "pink", "orange", "brown", "grey"]
data = []
for i in range(1000):
current_color = random.choice(colors)
current_tag = random.randint(1000, 9999)
current_coord = [ random.randint(0, 40) for _ in range(random.randint(3, 5)) ]
data.append({
"id": i,
"vector": [ random.uniform(-1, 1) for _ in range(5) ],
"color": current_color,
"color_tag": current_tag,
"color_coord": current_coord,
})
print(data[0])
# 3. Insert data
res = client.insert(
collection_name="test_collection",
data=data
)
print(res)
res = client.query( collection_name="test_collection",
filter="ARRAY_CONTAINS_ANY(color_coord, [7, 8, 9])",
output_fields=["id", "color", "color_tag", "color_coord"],
limit=3
)
print(res)
Upvotes: 0