mirror of https://github.com/milvus-io/milvus.git
[skip ci] interface name changed. (#5595)
Signed-off-by: Binbin Lv <binbin.lv@zilliz.com>pull/5606/head
parent
afa5da7df0
commit
4aefdaeabe
|
@ -22,7 +22,7 @@ epsilon = ct.epsilon
|
|||
CaseLabel = ct.CaseLabel
|
||||
|
||||
class TestCollectionSearch(ApiReq):
|
||||
""" Test case of search interface """
|
||||
""" Test case of collection search interface """
|
||||
|
||||
def init_data(self, insert_data=False, nb=3000, partition_num=0, multiple=False, is_binary=False):
|
||||
'''
|
||||
|
@ -41,13 +41,15 @@ class TestCollectionSearch(ApiReq):
|
|||
default_schema = cf.gen_default_collection_schema()
|
||||
else:
|
||||
default_schema = cf.gen_default_binary_collection_schema()
|
||||
collection, _ = self.collection.collection_init(default_collection_name, data=None, schema=default_schema)
|
||||
collection, _ = self.collection_wrap.collection_init(default_collection_name,
|
||||
data=None, schema=default_schema)
|
||||
# 2 add extra partition if specified (default is 1 partition named "_default")
|
||||
if partition_num > 0:
|
||||
log.info("init_data: creating partitions")
|
||||
for i in range(partition_num):
|
||||
partition_name = "search_partition_" + str(i)
|
||||
collection.create_partition(partition_name=partition_name, description="search partition")
|
||||
collection.create_partition(partition_name=partition_name,
|
||||
description="search partition")
|
||||
par = collection.partitions
|
||||
assert len(par) == (partition_num + 1)
|
||||
log.info("init_data: created partitions %s" % par)
|
||||
|
@ -55,18 +57,21 @@ class TestCollectionSearch(ApiReq):
|
|||
if insert_data:
|
||||
vectors = []
|
||||
raw_vectors = []
|
||||
log.info("init_data: inserting default data into collection %s (num_entities: %s)" % (collection.name, nb))
|
||||
log.info("init_data: inserting default data into collection %s (num_entities: %s)"
|
||||
% (collection.name, nb))
|
||||
if partition_num > 0:
|
||||
num = partition_num + 1
|
||||
for i in range(num):
|
||||
if not is_binary:
|
||||
vectors_num = [[random.random() for _ in range(default_dim)] for _ in range(nb // num)]
|
||||
vectors_num = [[random.random() for _ in range(default_dim)]
|
||||
for _ in range(nb // num)]
|
||||
vectors += vectors_num
|
||||
collection.insert(
|
||||
[[i for i in range(nb // num)], [np.float32(i) for i in range(nb // num)], vectors_num],
|
||||
par[i].name)
|
||||
else:
|
||||
default_binary_data, binary_raw_data = cf.gen_default_binary_dataframe_data(nb // num)
|
||||
default_binary_data, binary_raw_data = \
|
||||
cf.gen_default_binary_dataframe_data(nb // num)
|
||||
collection.insert(default_binary_data, par[i].name)
|
||||
vectors += default_binary_data
|
||||
raw_vectors += binary_raw_data
|
||||
|
@ -81,7 +86,8 @@ class TestCollectionSearch(ApiReq):
|
|||
collection.load()
|
||||
assert collection.is_empty == False
|
||||
assert collection.num_entities == nb
|
||||
log.info("init_data: inserted default data into collection %s (num_entities: %s)" % (collection.name, collection.num_entities))
|
||||
log.info("init_data: inserted default data into collection %s (num_entities: %s)"
|
||||
% (collection.name, collection.num_entities))
|
||||
if not is_binary:
|
||||
return collection, vectors
|
||||
else:
|
||||
|
@ -116,14 +122,14 @@ class TestCollectionSearch(ApiReq):
|
|||
self._connect()
|
||||
# 2. delete all the collections test search cases created before
|
||||
log.info("clear_env: clearing env")
|
||||
res_list, _ = self.utility.list_collections()
|
||||
res_list, _ = self.utility_wrap.list_collections()
|
||||
count = 0
|
||||
for res in res_list:
|
||||
collection = self.collection.collection_init(name=res)
|
||||
collection, _ = self.collection_wrap.collection_init(name=res)
|
||||
if "search_collection" in res:
|
||||
self.clear_data(collection)
|
||||
count = count + 1
|
||||
res_list_new, _ = self.utility.list_collections()
|
||||
res_list_new, _ = self.utility_wrap.list_collections()
|
||||
for res in res_list_new:
|
||||
assert not ("search_collection" in res)
|
||||
log.info("clear_env: cleared env (deleted %s search collections)" % count)
|
||||
|
@ -155,7 +161,7 @@ class TestCollectionSearch(ApiReq):
|
|||
log.info("test_search_no_connection: searched collection %s" % collection.name)
|
||||
# 3. remove connection
|
||||
log.info("test_search_no_connection: removing connection")
|
||||
self.connection.remove_connection(alias='default')
|
||||
self.connection_wrap.remove_connection(alias='default')
|
||||
log.info("test_search_no_connection: removed connection")
|
||||
# 4. search without connection
|
||||
log.info("test_search_no_connection: searching without connection")
|
||||
|
@ -194,7 +200,8 @@ class TestCollectionSearch(ApiReq):
|
|||
log.info("test_search_with_empty_collection: Searching empty collection %s" % collection.name)
|
||||
vectors = [[random.random() for _ in range(default_dim)] for _ in range(default_nq)]
|
||||
with pytest.raises(Exception) as e:
|
||||
collection.search(vectors[:default_nq], "float_vector", default_search_params, default_limit, default_search_exp)
|
||||
collection.search(vectors[:default_nq], "float_vector", default_search_params, default_limit,
|
||||
default_search_exp)
|
||||
assert "collection hasn't been loaded or has been released" in str(e.value)
|
||||
log.info("test_search_with_empty_collection: test PASS with expected assertion: %s" % e.value)
|
||||
|
||||
|
@ -233,7 +240,8 @@ class TestCollectionSearch(ApiReq):
|
|||
wrong_dim = 129
|
||||
vectors = [[random.random() for _ in range(wrong_dim)] for _ in range(default_nq)]
|
||||
with pytest.raises(Exception) as e:
|
||||
collection.search(vectors[:default_nq], default_search_field, default_search_params, default_limit, default_search_exp)
|
||||
collection.search(vectors[:default_nq], default_search_field, default_search_params, default_limit,
|
||||
default_search_exp)
|
||||
assert "UnexpectedError" in str(e.value)
|
||||
log.info("test_search_param_invalid_dim: test PASS with expected assertion: %s" % e.value)
|
||||
|
||||
|
@ -247,7 +255,8 @@ class TestCollectionSearch(ApiReq):
|
|||
vectors = [[random.random() for _ in range(default_dim)] for _ in range(default_nq)]
|
||||
search_params = {"metric_type": "L10", "params": {"nprobe": 10}}
|
||||
with pytest.raises(Exception) as e:
|
||||
collection.search(vectors[:default_nq], default_search_field, search_params, default_limit, default_search_exp)
|
||||
collection.search(vectors[:default_nq], default_search_field, search_params, default_limit,
|
||||
default_search_exp)
|
||||
assert "metric type not found" in str(e.value)
|
||||
log.info("test_search_param_invalid_metric_type: test PASS with expected assertion: %s" % e.value)
|
||||
|
||||
|
@ -262,13 +271,15 @@ class TestCollectionSearch(ApiReq):
|
|||
vectors = [[random.random() for _ in range(default_dim)] for _ in range(default_nq)]
|
||||
log.info("test_search_param_invalid_limit: searching with invalid limit (topK) = %s" % limit)
|
||||
with pytest.raises(Exception) as e:
|
||||
collection.search(vectors[:default_nq], default_search_field, default_search_params, limit, default_search_exp)
|
||||
collection.search(vectors[:default_nq], default_search_field, default_search_params, limit,
|
||||
default_search_exp)
|
||||
assert "division by zero" in str(e.value)
|
||||
log.info("test_search_param_invalid_limit: test PASS with expected assertion: %s" % e.value)
|
||||
limit = 16385
|
||||
log.info("test_search_param_invalid_limit: searching with invalid max limit (topK) = %s" % limit)
|
||||
with pytest.raises(Exception) as e:
|
||||
collection.search(vectors[:default_nq], default_search_field, default_search_params, limit, default_search_exp)
|
||||
collection.search(vectors[:default_nq], default_search_field, default_search_params, limit,
|
||||
default_search_exp)
|
||||
assert "limit" and "too large" in str(e.value)
|
||||
log.info("test_search_param_invalid_limit: test PASS with expected assertion: %s" % e.value)
|
||||
|
||||
|
@ -288,7 +299,8 @@ class TestCollectionSearch(ApiReq):
|
|||
log.info("test_search_param_invalid_field: searching with invalid field")
|
||||
invalid_search_field = "floatvector"
|
||||
with pytest.raises(Exception) as e:
|
||||
collection.search(vectors[:default_nq], invalid_search_field, default_search_params, default_limit, default_search_exp)
|
||||
collection.search(vectors[:default_nq], invalid_search_field, default_search_params, default_limit,
|
||||
default_search_exp)
|
||||
assert "invalid expression" in str(e.value)
|
||||
log.info("test_search_param_invalid_field: test PASS with expected assertion: %s" % e.value)
|
||||
|
||||
|
@ -307,7 +319,8 @@ class TestCollectionSearch(ApiReq):
|
|||
log.info("test_search_param_invalid_expr: test PASS with expected assertion: %s" % e.value)
|
||||
log.info("test_search_param_invalid_expr: searching with invalid expr")
|
||||
with pytest.raises(Exception) as e:
|
||||
collection.search(vectors[:default_nq], default_search_field, default_search_params, default_limit, "int63 >= 0")
|
||||
collection.search(vectors[:default_nq], default_search_field, default_search_params, default_limit,
|
||||
"int63 >= 0")
|
||||
assert "invalid expression" in str(e.value)
|
||||
log.info("test_search_param_invalid_expr: test PASS with expected assertion: %s" % e.value)
|
||||
|
||||
|
@ -346,7 +359,8 @@ class TestCollectionSearch(ApiReq):
|
|||
_, binary_vectors = cf.gen_binary_vectors(3000, default_dim)
|
||||
wrong_search_params = {"metric_type": "L2", "params": {"nprobe": 10}}
|
||||
with pytest.raises(Exception) as e:
|
||||
collection.search(binary_vectors[:nq], "binary_vector", wrong_search_params, default_limit, default_search_exp)
|
||||
collection.search(binary_vectors[:nq], "binary_vector", wrong_search_params, default_limit,
|
||||
default_search_exp)
|
||||
assert "unsupported" in str(e.value)
|
||||
log.info("test_search_param_invalid_value: test PASS with expected assertion: %s" % e.value)
|
||||
"""
|
||||
|
@ -448,7 +462,8 @@ class TestCollectionSearch(ApiReq):
|
|||
limit = 1
|
||||
vectors = [[random.random() for _ in range(default_dim)] for _ in range(default_nq)]
|
||||
for _ in range(N):
|
||||
res = collection.search(vectors[:default_nq], "float_vector", default_search_params, limit, default_search_exp)
|
||||
res = collection.search(vectors[:default_nq], "float_vector", default_search_params, limit,
|
||||
default_search_exp)
|
||||
log.info("test_search_collection_multiple_times: Searched results length: %s" % len(res))
|
||||
assert len(res) == default_nq
|
||||
for hits in res:
|
||||
|
@ -546,7 +561,8 @@ class TestCollectionSearch(ApiReq):
|
|||
distance_1 = cf.jaccard(query_raw_vector[0], binary_raw_vector[1])
|
||||
# 4. search and compare the distance
|
||||
search_params = {"metric_type": "JACCARD", "params": {"nprobe": 10}}
|
||||
res = collection.search(binary_vectors[:default_nq], "binary_vector", search_params, default_limit, "int64 >= 0")
|
||||
res = collection.search(binary_vectors[:default_nq], "binary_vector", search_params, default_limit,
|
||||
"int64 >= 0")
|
||||
assert abs(res[0]._distances[0] - min(distance_0, distance_1)) <= epsilon
|
||||
|
||||
@pytest.mark.tags(CaseLabel.L3)
|
||||
|
@ -621,14 +637,16 @@ class TestCollectionSearch(ApiReq):
|
|||
expected: search status ok, the length of result
|
||||
'''
|
||||
log.info("Test case of search interface: test_search_multi_collections")
|
||||
self._connect()
|
||||
connection_num = 10
|
||||
for _ in range(connection_num):
|
||||
for i in range(connection_num):
|
||||
# 1. initialize with data
|
||||
log.info("test_search_multi_collections: search round %d" % i)
|
||||
collection, _ = self.init_data(insert_data=True, multiple=True)
|
||||
# 2. search
|
||||
vectors = [[random.random() for _ in range(default_dim)] for _ in range(default_nq)]
|
||||
log.info("test_search_multi_collections: searching %s entities (nq = %s) from collection %s" % (
|
||||
default_limit, default_nq, collection.name))
|
||||
log.info("test_search_multi_collections: searching %s entities (nq = %s) from collection %s" %
|
||||
(default_limit, default_nq, collection.name))
|
||||
res = collection.search(vectors[:default_nq], default_search_field, default_search_params,
|
||||
default_limit, default_search_exp)
|
||||
assert len(res) == default_nq
|
||||
|
@ -636,6 +654,7 @@ class TestCollectionSearch(ApiReq):
|
|||
assert len(hits) == default_limit
|
||||
assert len(hits.ids) == default_limit
|
||||
log.info("test_search_multi_collections: searched %s collections" % connection_num)
|
||||
self.clear_env()
|
||||
|
||||
@pytest.mark.tags(CaseLabel.L3)
|
||||
@pytest.mark.timeout(300)
|
||||
|
|
Loading…
Reference in New Issue