Versions Compared

Key

  • This line was added.
  • This line was removed.
  • Formatting was changed.

...

下图为一个 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 接口,该索引在用完后也即刻销毁。此方案没有额外的内存开销,但是否可行需进一步调研。

Image Added


查询结果的处理

Query 返回的查询结果有2种,一种为 SubSearchResult,用于存放 segment 中每个 chunk 的查询结果。

需要添加成员变量 "is_range_search_" 和 "lims_",以及成员函数 "merge_range()" 和 "merge_range_impl()"。

Code Block
languagecpp
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
languagecpp
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 的具体实现方案一起讨论。Image Removed


Compatibility, Deprecation, and Migration Plan(optional)

...