mirror of
https://gitee.com/milvus-io/milvus.git
synced 2025-12-08 01:58:34 +08:00
fix range search (#25880)
Signed-off-by: xianliang <xianliang.li@zilliz.com>
This commit is contained in:
parent
760a2d9aa7
commit
5437fcce8e
@ -64,6 +64,11 @@ VecIndexConfig::GetSearchConf(const SearchInfo& searchInfo) {
|
|||||||
SearchInfo searchParam(searchInfo);
|
SearchInfo searchParam(searchInfo);
|
||||||
searchParam.metric_type_ = metric_type_;
|
searchParam.metric_type_ = metric_type_;
|
||||||
searchParam.search_params_ = search_params_;
|
searchParam.search_params_ = search_params_;
|
||||||
|
for (auto& key : maintain_params) {
|
||||||
|
if (searchInfo.search_params_.contains(key)) {
|
||||||
|
searchParam.search_params_[key] = searchInfo.search_params_[key];
|
||||||
|
}
|
||||||
|
}
|
||||||
return searchParam;
|
return searchParam;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@ -33,6 +33,9 @@ class VecIndexConfig {
|
|||||||
inline static const std::map<std::string, double> index_build_ratio = {
|
inline static const std::map<std::string, double> index_build_ratio = {
|
||||||
{knowhere::IndexEnum::INDEX_FAISS_IVFFLAT_CC, 0.1}};
|
{knowhere::IndexEnum::INDEX_FAISS_IVFFLAT_CC, 0.1}};
|
||||||
|
|
||||||
|
inline static const std::unordered_set<std::string> maintain_params = {
|
||||||
|
"radius", "range_filter"};
|
||||||
|
|
||||||
public:
|
public:
|
||||||
VecIndexConfig(const int64_t max_index_row_count,
|
VecIndexConfig(const int64_t max_index_row_count,
|
||||||
const FieldIndexMeta& index_meta_,
|
const FieldIndexMeta& index_meta_,
|
||||||
|
|||||||
@ -75,6 +75,19 @@ TEST(GrowingIndex, Correctness) {
|
|||||||
query_info->set_search_params(R"({"nprobe": 16})");
|
query_info->set_search_params(R"({"nprobe": 16})");
|
||||||
auto plan_str = plan_node.SerializeAsString();
|
auto plan_str = plan_node.SerializeAsString();
|
||||||
|
|
||||||
|
milvus::proto::plan::PlanNode range_query_plan_node;
|
||||||
|
auto vector_range_querys = range_query_plan_node.mutable_vector_anns();
|
||||||
|
vector_range_querys->set_is_binary(false);
|
||||||
|
vector_range_querys->set_placeholder_tag("$0");
|
||||||
|
vector_range_querys->set_field_id(102);
|
||||||
|
auto range_query_info = vector_range_querys->mutable_query_info();
|
||||||
|
range_query_info->set_topk(5);
|
||||||
|
range_query_info->set_round_decimal(3);
|
||||||
|
range_query_info->set_metric_type("l2");
|
||||||
|
range_query_info->set_search_params(
|
||||||
|
R"({"nprobe": 10, "radius": 600, "range_filter": 500})");
|
||||||
|
auto range_plan_str = range_query_plan_node.SerializeAsString();
|
||||||
|
|
||||||
int64_t per_batch = 10000;
|
int64_t per_batch = 10000;
|
||||||
int64_t n_batch = 20;
|
int64_t n_batch = 20;
|
||||||
int64_t top_k = 5;
|
int64_t top_k = 5;
|
||||||
@ -99,10 +112,11 @@ TEST(GrowingIndex, Correctness) {
|
|||||||
EXPECT_EQ(filed_data->num_chunk(), 0);
|
EXPECT_EQ(filed_data->num_chunk(), 0);
|
||||||
}
|
}
|
||||||
|
|
||||||
auto plan = milvus::query::CreateSearchPlanByExpr(
|
|
||||||
*schema, plan_str.data(), plan_str.size());
|
|
||||||
auto num_queries = 5;
|
auto num_queries = 5;
|
||||||
auto ph_group_raw = CreatePlaceholderGroup(num_queries, 128, 1024);
|
auto ph_group_raw = CreatePlaceholderGroup(num_queries, 128, 1024);
|
||||||
|
|
||||||
|
auto plan = milvus::query::CreateSearchPlanByExpr(
|
||||||
|
*schema, plan_str.data(), plan_str.size());
|
||||||
auto ph_group =
|
auto ph_group =
|
||||||
ParsePlaceholderGroup(plan.get(), ph_group_raw.SerializeAsString());
|
ParsePlaceholderGroup(plan.get(), ph_group_raw.SerializeAsString());
|
||||||
Timestamp time = 1000000;
|
Timestamp time = 1000000;
|
||||||
@ -111,6 +125,23 @@ TEST(GrowingIndex, Correctness) {
|
|||||||
EXPECT_EQ(sr->unity_topK_, top_k);
|
EXPECT_EQ(sr->unity_topK_, top_k);
|
||||||
EXPECT_EQ(sr->distances_.size(), num_queries * top_k);
|
EXPECT_EQ(sr->distances_.size(), num_queries * top_k);
|
||||||
EXPECT_EQ(sr->seg_offsets_.size(), num_queries * top_k);
|
EXPECT_EQ(sr->seg_offsets_.size(), num_queries * top_k);
|
||||||
|
|
||||||
|
auto range_plan = milvus::query::CreateSearchPlanByExpr(
|
||||||
|
*schema, range_plan_str.data(), range_plan_str.size());
|
||||||
|
auto range_ph_group = ParsePlaceholderGroup(
|
||||||
|
range_plan.get(), ph_group_raw.SerializeAsString());
|
||||||
|
auto range_sr =
|
||||||
|
segment->Search(range_plan.get(), range_ph_group.get(), time);
|
||||||
|
ASSERT_EQ(range_sr->total_nq_, num_queries);
|
||||||
|
EXPECT_EQ(sr->unity_topK_, top_k);
|
||||||
|
EXPECT_EQ(sr->distances_.size(), num_queries * top_k);
|
||||||
|
EXPECT_EQ(sr->seg_offsets_.size(), num_queries * top_k);
|
||||||
|
for (int j = 0; j < range_sr->seg_offsets_.size(); j++) {
|
||||||
|
if (range_sr->seg_offsets_[j] != -1) {
|
||||||
|
EXPECT_TRUE(sr->distances_[j] >= 500.0 &&
|
||||||
|
sr->distances_[j] <= 600.0);
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user