refactor(core): unify search invoke (#15)
Co-authored-by: feihongxu0824 <xufeihong.xfh@alibaba-inc.com>
This commit is contained in:
parent
6df6ba8fce
commit
a20d484e9e
|
|
@ -106,28 +106,6 @@ int HnswAlgorithm::search(HnswContext *ctx) const {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int HnswAlgorithm::fast_search(HnswContext *ctx) const {
|
||||
auto max_level = entity_.cur_max_level();
|
||||
auto entry_point = entity_.entry_point();
|
||||
|
||||
dist_t dist = ctx->dist_calculator().dist(entry_point);
|
||||
for (level_t cur_level = max_level; cur_level >= 1; --cur_level) {
|
||||
select_entry_point(cur_level, &entry_point, &dist, ctx);
|
||||
}
|
||||
|
||||
auto &topk_heap = ctx->topk_heap();
|
||||
topk_heap.clear();
|
||||
|
||||
search_neighbors(0, &entry_point, &dist, topk_heap, ctx);
|
||||
|
||||
if (ctx->group_by_search()) {
|
||||
expand_neighbors_by_group(topk_heap, ctx);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//! select_entry_point on hnsw level, ef = 1
|
||||
void HnswAlgorithm::select_entry_point(level_t level, node_id_t *entry_point,
|
||||
dist_t *dist, HnswContext *ctx) const {
|
||||
|
|
|
|||
|
|
@ -43,14 +43,10 @@ class HnswAlgorithm {
|
|||
//! return 0 on success, or errCode in failure
|
||||
int add_node(node_id_t id, level_t level, HnswContext *ctx);
|
||||
|
||||
//! do knn search in graph with lock
|
||||
//! do knn search in graph
|
||||
//! return 0 on success, or errCode in failure. results saved in ctx
|
||||
int search(HnswContext *ctx) const;
|
||||
|
||||
//! do knn search in graph without lock
|
||||
//! return 0 on success, or errCode in failure. results saved in ctx
|
||||
int fast_search(HnswContext *ctx) const;
|
||||
|
||||
//! Initiate HnswAlgorithm
|
||||
int init() {
|
||||
level_probas_.clear();
|
||||
|
|
|
|||
|
|
@ -218,7 +218,7 @@ int HnswSearcher::search_impl(const void *query, const IndexQueryMeta &qmeta,
|
|||
ctx->resize_results(count);
|
||||
for (size_t q = 0; q < count; ++q) {
|
||||
ctx->reset_query(query);
|
||||
int ret = alg_->fast_search(ctx);
|
||||
int ret = alg_->search(ctx);
|
||||
if (ailego_unlikely(ret != 0)) {
|
||||
LOG_ERROR("Hnsw searcher fast search failed");
|
||||
return ret;
|
||||
|
|
|
|||
|
|
@ -108,28 +108,6 @@ int HnswSparseAlgorithm::search(HnswSparseContext *ctx) const {
|
|||
return 0;
|
||||
}
|
||||
|
||||
int HnswSparseAlgorithm::fast_search(HnswSparseContext *ctx) const {
|
||||
auto max_level = entity_.cur_max_level();
|
||||
auto entry_point = entity_.entry_point();
|
||||
|
||||
dist_t dist = ctx->dist_calculator().dist(entry_point);
|
||||
for (level_t cur_level = max_level; cur_level >= 1; --cur_level) {
|
||||
select_entry_point(cur_level, &entry_point, &dist, ctx);
|
||||
}
|
||||
|
||||
auto &topk_heap = ctx->topk_heap();
|
||||
topk_heap.clear();
|
||||
|
||||
search_neighbors(0, &entry_point, &dist, topk_heap, ctx);
|
||||
|
||||
if (ctx->group_by_search()) {
|
||||
expand_neighbors_by_group(topk_heap, ctx);
|
||||
}
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
//! select_entry_point on hnsw level, ef = 1
|
||||
void HnswSparseAlgorithm::select_entry_point(level_t level,
|
||||
node_id_t *entry_point,
|
||||
|
|
|
|||
|
|
@ -40,14 +40,10 @@ class HnswSparseAlgorithm {
|
|||
//! return 0 on success, or errCode in failure
|
||||
int add_node(node_id_t id, level_t level, HnswSparseContext *ctx);
|
||||
|
||||
//! do knn search in graph with lock
|
||||
//! do knn search in graph
|
||||
//! return 0 on success, or errCode in failure. results saved in ctx
|
||||
int search(HnswSparseContext *ctx) const;
|
||||
|
||||
//! do knn search in graph without lock
|
||||
//! return 0 on success, or errCode in failure. results saved in ctx
|
||||
int fast_search(HnswSparseContext *ctx) const;
|
||||
|
||||
//! Initiate HnswAlgorithm
|
||||
int init() {
|
||||
level_probas_.clear();
|
||||
|
|
|
|||
|
|
@ -261,7 +261,7 @@ int HnswSparseSearcher::search_impl(const uint32_t *sparse_count,
|
|||
ctx->reset_query(sparse_query_buffer.data());
|
||||
}
|
||||
|
||||
int ret = alg_->fast_search(ctx);
|
||||
int ret = alg_->search(ctx);
|
||||
if (ailego_unlikely(ret != 0)) {
|
||||
LOG_ERROR("Hnsw searcher fast search failed");
|
||||
return ret;
|
||||
|
|
|
|||
Loading…
Reference in New Issue