Skip to content

Commit 72b11b0

Browse files
committed
enhance: speed up search iter stage 1
Signed-off-by: Patrick Weizhi Xu <[email protected]> (cherry picked from commit bf22e21)
1 parent f441ccd commit 72b11b0

23 files changed

+1970
-117
lines changed

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -64,6 +64,7 @@ require (
6464
github.com/cenkalti/backoff/v4 v4.2.1
6565
github.com/cockroachdb/redact v1.1.3
6666
github.com/goccy/go-json v0.10.3
67+
github.com/google/uuid v1.6.0
6768
github.com/greatroar/blobloom v0.0.0-00010101000000-000000000000
6869
github.com/hashicorp/golang-lru/v2 v2.0.7
6970
github.com/jolestar/go-commons-pool/v2 v2.1.2
@@ -144,7 +145,6 @@ require (
144145
github.com/golang/snappy v0.0.4 // indirect
145146
github.com/google/flatbuffers v2.0.8+incompatible // indirect
146147
github.com/google/s2a-go v0.1.7 // indirect
147-
github.com/google/uuid v1.6.0 // indirect
148148
github.com/googleapis/enterprise-certificate-proxy v0.3.2 // indirect
149149
github.com/googleapis/gax-go/v2 v2.12.5 // indirect
150150
github.com/gorilla/websocket v1.4.2 // indirect

internal/core/src/common/QueryInfo.h

+7
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,12 @@
2424

2525
namespace milvus {
2626

27+
struct SearchIteratorV2Info {
28+
std::string token = "";
29+
uint32_t batch_size = 0;
30+
std::optional<float> last_bound = std::nullopt;
31+
};
32+
2733
struct SearchInfo {
2834
int64_t topk_{0};
2935
int64_t group_size_{1};
@@ -36,6 +42,7 @@ struct SearchInfo {
3642
tracer::TraceContext trace_ctx_;
3743
bool materialized_view_involved = false;
3844
bool iterative_filter_execution = false;
45+
std::optional<SearchIteratorV2Info> iterator_v2_info_ = std::nullopt;
3946
};
4047

4148
using SearchInfoPtr = std::shared_ptr<SearchInfo>;

internal/core/src/index/Utils.cpp

+34
Original file line numberDiff line numberDiff line change
@@ -362,4 +362,38 @@ ReadDataFromFD(int fd, void* buf, size_t size, size_t chunk_size) {
362362
}
363363
}
364364

365+
bool
366+
CheckAndUpdateKnowhereRangeSearchParam(const SearchInfo& search_info,
367+
const int64_t topk,
368+
const MetricType& metric_type,
369+
knowhere::Json& search_config) {
370+
const auto radius =
371+
index::GetValueFromConfig<float>(search_info.search_params_, RADIUS);
372+
if (!radius.has_value()) {
373+
return false;
374+
}
375+
376+
search_config[RADIUS] = radius.value();
377+
// `range_search_k` is only used as one of the conditions for iterator early termination.
378+
// not gurantee to return exactly `range_search_k` results, which may be more or less.
379+
// set it to -1 will return all results in the range.
380+
search_config[knowhere::meta::RANGE_SEARCH_K] = topk;
381+
382+
const auto range_filter =
383+
GetValueFromConfig<float>(search_info.search_params_, RANGE_FILTER);
384+
if (range_filter.has_value()) {
385+
search_config[RANGE_FILTER] = range_filter.value();
386+
CheckRangeSearchParam(
387+
search_config[RADIUS], search_config[RANGE_FILTER], metric_type);
388+
}
389+
390+
const auto page_retain_order =
391+
GetValueFromConfig<bool>(search_info.search_params_, PAGE_RETAIN_ORDER);
392+
if (page_retain_order.has_value()) {
393+
search_config[knowhere::meta::RETAIN_ITERATOR_ORDER] =
394+
page_retain_order.value();
395+
}
396+
return true;
397+
}
398+
365399
} // namespace milvus::index

internal/core/src/index/Utils.h

+8
Original file line numberDiff line numberDiff line change
@@ -30,6 +30,8 @@
3030

3131
#include "common/Types.h"
3232
#include "common/FieldData.h"
33+
#include "common/QueryInfo.h"
34+
#include "common/RangeSearchHelper.h"
3335
#include "index/IndexInfo.h"
3436
#include "storage/Types.h"
3537

@@ -147,4 +149,10 @@ AssembleIndexDatas(std::map<std::string, FieldDataChannelPtr>& index_datas,
147149
void
148150
ReadDataFromFD(int fd, void* buf, size_t size, size_t chunk_size = 0x7ffff000);
149151

152+
bool
153+
CheckAndUpdateKnowhereRangeSearchParam(const SearchInfo& search_info,
154+
const int64_t topk,
155+
const MetricType& metric_type,
156+
knowhere::Json& search_config);
157+
150158
} // namespace milvus::index

internal/core/src/index/VectorDiskIndex.cpp

+2-25
Original file line numberDiff line numberDiff line change
@@ -266,32 +266,9 @@ VectorDiskAnnIndex<T>::Query(const DatasetPtr dataset,
266266
search_config[DISK_ANN_PREFIX_PATH] = local_index_path_prefix;
267267

268268
auto final = [&] {
269-
auto radius =
270-
GetValueFromConfig<float>(search_info.search_params_, RADIUS);
271-
if (radius.has_value()) {
272-
search_config[RADIUS] = radius.value();
273-
// `range_search_k` is only used as one of the conditions for iterator early termination.
274-
// not gurantee to return exactly `range_search_k` results, which may be more or less.
275-
// set it to -1 will return all results in the range.
276-
search_config[knowhere::meta::RANGE_SEARCH_K] = topk;
277-
auto range_filter = GetValueFromConfig<float>(
278-
search_info.search_params_, RANGE_FILTER);
279-
if (range_filter.has_value()) {
280-
search_config[RANGE_FILTER] = range_filter.value();
281-
CheckRangeSearchParam(search_config[RADIUS],
282-
search_config[RANGE_FILTER],
283-
GetMetricType());
284-
}
285-
286-
auto page_retain_order = GetValueFromConfig<bool>(
287-
search_info.search_params_, PAGE_RETAIN_ORDER);
288-
if (page_retain_order.has_value()) {
289-
search_config[knowhere::meta::RETAIN_ITERATOR_ORDER] =
290-
page_retain_order.value();
291-
}
292-
269+
if (CheckAndUpdateKnowhereRangeSearchParam(
270+
search_info, topk, GetMetricType(), search_config)) {
293271
auto res = index_.RangeSearch(dataset, search_config, bitset);
294-
295272
if (!res.has_value()) {
296273
PanicInfo(ErrorCode::UnexpectedError,
297274
fmt::format("failed to range search: {}: {}",

internal/core/src/index/VectorMemIndex.cpp

+2-10
Original file line numberDiff line numberDiff line change
@@ -380,16 +380,8 @@ VectorMemIndex<T>::Query(const DatasetPtr dataset,
380380
// TODO :: check dim of search data
381381
auto final = [&] {
382382
auto index_type = GetIndexType();
383-
if (CheckKeyInConfig(search_conf, RADIUS)) {
384-
if (CheckKeyInConfig(search_conf, RANGE_FILTER)) {
385-
CheckRangeSearchParam(search_conf[RADIUS],
386-
search_conf[RANGE_FILTER],
387-
GetMetricType());
388-
}
389-
// `range_search_k` is only used as one of the conditions for iterator early termination.
390-
// not gurantee to return exactly `range_search_k` results, which may be more or less.
391-
// set it to -1 will return all results in the range.
392-
search_conf[knowhere::meta::RANGE_SEARCH_K] = topk;
383+
if (CheckAndUpdateKnowhereRangeSearchParam(
384+
search_info, topk, GetMetricType(), search_conf)) {
393385
milvus::tracer::AddEvent("start_knowhere_index_range_search");
394386
auto res = index_.RangeSearch(dataset, search_conf, bitset);
395387
milvus::tracer::AddEvent("finish_knowhere_index_range_search");

0 commit comments

Comments
 (0)