...
下图为一个 Search 请求从 SDK 到 SEGCORE 的完整调用栈,range search 完全复用该调用栈,不需要做任何改动。range search 只需要将参数 "radius" 在 SDK 端放入查询参数 "param" 中。
下图为 SEGCORE 内部向量查询时的调用栈示意图,黑色部分为现已实现的功能,红色部分为支持 range search 需要添加的功能函数。内部向量查询时的调用栈示意图,黑色部分为现已实现的功能。
对于 sealed segment,要实现 range search 功能需要 knowhere 提供 QueryByRange 功能;
对于 growing segment 时,由于没有创建 index ,所以无法用 knowhere IDMAP 实现的暴搜功能,只能自己额外实现了暴搜的全套逻辑。若要实现 range search,需要另外实现红色部分所示的功能函数。
另一解决方案是,knowhere 提供一种新的 IDMAP 索引,该索引不需要插入向量数据,只需要指定向量数据的内存地址。growing segment 在查询时可临时生成该种索引,继而调用 IDMAP 提供的 Query & QueryByRange 接口,该索引在用完后也即刻销毁。此方案没有额外的内存开销,但是否可行需进一步调研。
查询结果的处理
Query 返回的查询结果有2种,一种为 SubSearchResult,用于存放 segment 中每个 chunk 的查询结果。
需要添加成员变量 "is_range_search_" 和 "lims_",以及成员函数 "merge_range()" 和 "merge_range_impl()"。
Code Block | ||
---|---|---|
| ||
class SubSearchResult {
... ...
static SubSearchResult
merge(const SubSearchResult& left, const SubSearchResult& right);
void
merge(const SubSearchResult& sub_result);
static SubSearchResult
merge_range(const SubSearchResult& left, const SubSearchResult& right); // <==== new added
void
merge_range(const SubSearchResult& sub_result); // <==== new added
private:
template <bool is_desc>
void
merge_impl(const SubSearchResult& sub_result);
void
merge_range_impl(const SubSearchResult& sub_result); // <==== new added
private:
bool is_range_search_; // <==== new added
int64_t num_queries_;
int64_t topk_;
int64_t round_decimal_;
MetricType metric_type_;
std::vector<int64_t> seg_offsets_;
std::vector<float> distances_;
std::vector<size_t> lims_; // <==== new added |
另一种为 SearchResult,用于存放该 segment 的查询结果。
需要添加成员变量 "is_range_search_" 和 "lims_"。
Code Block | ||
---|---|---|
| ||
struct SearchResult {
... ...
public:
int64_t total_nq_;
int64_t unity_topK_;
void* segment_;
// first fill data during search, and then update data after reducing search results
bool is_range_search_; // <==== new added
std::vector<float> distances_;
std::vector<int64_t> seg_offsets_;
std::vector<size_t> lims_; // <==== new added
... ...
}; |
在 Query node 中还需要实现多个 segment 之间的 reduce_range();
在 Proxy 中还需要实现多个 SearchResult 之间的 reduce_range();
关于输出结果的处理,需要和 Pagination 的具体实现方案一起讨论。
Compatibility, Deprecation, and Migration Plan(optional)
...