From e1f11e29fef60725d882745ca8d11243d7e35378 Mon Sep 17 00:00:00 2001 From: ZeFeng Yin Date: Fri, 7 Aug 2026 16:14:44 +0800 Subject: [PATCH] fix(search): validate filters and reset stale filter state (#663) --- src/core/interface/indexes/flat_index.cc | 6 ++++-- src/core/interface/indexes/hnsw_index.cc | 4 +++- src/core/interface/indexes/hnsw_rabitq_index.cc | 4 +++- src/core/interface/indexes/ivf_index.cc | 6 ++++-- src/core/interface/indexes/vamana_index.cc | 4 +++- 5 files changed, 17 insertions(+), 7 deletions(-) diff --git a/src/core/interface/indexes/flat_index.cc b/src/core/interface/indexes/flat_index.cc index 032f366..f8d3002 100644 --- a/src/core/interface/indexes/flat_index.cc +++ b/src/core/interface/indexes/flat_index.cc @@ -57,8 +57,10 @@ int FlatIndex::_prepare_for_search( context->set_topk(flat_search_param->topk); context->set_fetch_vector(flat_search_param->fetch_vector); - if (flat_search_param->filter) { + if (flat_search_param->filter && flat_search_param->filter->is_valid()) { context->set_filter(std::move(*flat_search_param->filter)); + } else { + context->reset_filter(); } if (flat_search_param->radius > 0.0f) { context->set_threshold(flat_search_param->radius); @@ -69,4 +71,4 @@ int FlatIndex::_prepare_for_search( } -} // namespace zvec::core_interface \ No newline at end of file +} // namespace zvec::core_interface diff --git a/src/core/interface/indexes/hnsw_index.cc b/src/core/interface/indexes/hnsw_index.cc index 7b88263..4089623 100644 --- a/src/core/interface/indexes/hnsw_index.cc +++ b/src/core/interface/indexes/hnsw_index.cc @@ -154,8 +154,10 @@ int HNSWIndex::_prepare_for_search( context->set_topk(hnsw_search_param->topk); context->set_fetch_vector(hnsw_search_param->fetch_vector); - if (hnsw_search_param->filter) { + if (hnsw_search_param->filter && hnsw_search_param->filter->is_valid()) { context->set_filter(std::move(*hnsw_search_param->filter)); + } else { + context->reset_filter(); } if (hnsw_search_param->radius > 0.0f) { context->set_threshold(hnsw_search_param->radius); diff --git a/src/core/interface/indexes/hnsw_rabitq_index.cc b/src/core/interface/indexes/hnsw_rabitq_index.cc index 251fe10..49a9c98 100644 --- a/src/core/interface/indexes/hnsw_rabitq_index.cc +++ b/src/core/interface/indexes/hnsw_rabitq_index.cc @@ -113,8 +113,10 @@ int HNSWRabitqIndex::_prepare_for_search( context->set_topk(hnsw_search_param->topk); context->set_fetch_vector(hnsw_search_param->fetch_vector); - if (hnsw_search_param->filter) { + if (hnsw_search_param->filter && hnsw_search_param->filter->is_valid()) { context->set_filter(std::move(*hnsw_search_param->filter)); + } else { + context->reset_filter(); } if (hnsw_search_param->radius > 0.0f) { context->set_threshold(hnsw_search_param->radius); diff --git a/src/core/interface/indexes/ivf_index.cc b/src/core/interface/indexes/ivf_index.cc index 9df540f..b375157 100644 --- a/src/core/interface/indexes/ivf_index.cc +++ b/src/core/interface/indexes/ivf_index.cc @@ -221,8 +221,10 @@ int IVFIndex::_prepare_for_search( context->set_topk(ivf_search_param->topk); context->set_fetch_vector(ivf_search_param->fetch_vector); - if (ivf_search_param->filter) { + if (ivf_search_param->filter && ivf_search_param->filter->is_valid()) { context->set_filter(std::move(*ivf_search_param->filter)); + } else { + context->reset_filter(); } if (ivf_search_param->radius > 0.0f) { context->set_threshold(ivf_search_param->radius); @@ -270,4 +272,4 @@ int IVFIndex::Merge(const std::vector &indexes, is_trained_ = true; return 0; } -} // namespace zvec::core_interface \ No newline at end of file +} // namespace zvec::core_interface diff --git a/src/core/interface/indexes/vamana_index.cc b/src/core/interface/indexes/vamana_index.cc index f40991b..c9d8eee 100644 --- a/src/core/interface/indexes/vamana_index.cc +++ b/src/core/interface/indexes/vamana_index.cc @@ -86,8 +86,10 @@ int VamanaIndex::_prepare_for_search( context->set_topk(vamana_search_param->topk); context->set_fetch_vector(vamana_search_param->fetch_vector); - if (vamana_search_param->filter) { + if (vamana_search_param->filter && vamana_search_param->filter->is_valid()) { context->set_filter(std::move(*vamana_search_param->filter)); + } else { + context->reset_filter(); } if (vamana_search_param->radius > 0.0f) { context->set_threshold(vamana_search_param->radius);