fix range search (#25880)

Signed-off-by: xianliang <xianliang.li@zilliz.com>
This commit is contained in:
foxspy 2023-07-25 10:07:01 +08:00 committed by GitHub
parent 760a2d9aa7
commit 5437fcce8e
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
3 changed files with 41 additions and 2 deletions

View File

@ -64,6 +64,11 @@ VecIndexConfig::GetSearchConf(const SearchInfo& searchInfo) {
SearchInfo searchParam(searchInfo);
searchParam.metric_type_ = metric_type_;
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;
}

View File

@ -33,6 +33,9 @@ class VecIndexConfig {
inline static const std::map<std::string, double> index_build_ratio = {
{knowhere::IndexEnum::INDEX_FAISS_IVFFLAT_CC, 0.1}};
inline static const std::unordered_set<std::string> maintain_params = {
"radius", "range_filter"};
public:
VecIndexConfig(const int64_t max_index_row_count,
const FieldIndexMeta& index_meta_,

View File

@ -75,6 +75,19 @@ TEST(GrowingIndex, Correctness) {
query_info->set_search_params(R"({"nprobe": 16})");
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 n_batch = 20;
int64_t top_k = 5;
@ -99,10 +112,11 @@ TEST(GrowingIndex, Correctness) {
EXPECT_EQ(filed_data->num_chunk(), 0);
}
auto plan = milvus::query::CreateSearchPlanByExpr(
*schema, plan_str.data(), plan_str.size());
auto num_queries = 5;
auto ph_group_raw = CreatePlaceholderGroup(num_queries, 128, 1024);
auto plan = milvus::query::CreateSearchPlanByExpr(
*schema, plan_str.data(), plan_str.size());
auto ph_group =
ParsePlaceholderGroup(plan.get(), ph_group_raw.SerializeAsString());
Timestamp time = 1000000;
@ -111,6 +125,23 @@ TEST(GrowingIndex, Correctness) {
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);
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);
}
}
}
}