Affected area
sindi
Interface
cpp
VSAG version
v0.18.8
Summary
range search on sindi return repeated results
Minimal reproducer
vsag::Resource resource;
vsag::Engine engine(&resource);
const std::string build_params = R"({
"dtype": "sparse",
"dim": 3,
"metric_type": "ip",
"index_param": {
"use_reorder": true,
"term_id_limit": 4000,
"doc_prune_ratio": 0,
"window_size": 60000,
"use_quantization": false
}
})";
auto create_result = engine.CreateIndex("sindi", build_params);
auto index = create_result.value();
std::vector<std::vector<uint32_t>> indices = {
{5, 100, 2000}, {5, 50, 2000}, {10, 100, 3000}};
std::vector<std::vector> values = {
{0.5f, 0.8f, 0.6f}, {0.3f, 0.9f, 0.1f}, {0.7f, 0.4f, 0.5f}};
std::vector<int64_t> ids = {1, 2, 3};
for (size_t i = 0; i < ids.size(); ++i) {
vsag::SparseVector sparse_vector;
sparse_vector.len_ = static_cast<uint32_t>(indices[i].size());
sparse_vector.ids_ = indices[i].data();
sparse_vector.vals_ = values[i].data();
auto dataset = vsag::Dataset::Make();
dataset->NumElements(1)
->Ids(&ids[i])
->SparseVectors(&sparse_vector)
->Owner(false);
auto add_result = index->Add(dataset);
}
vsag::SparseVector query_vector;
query_vector.len_ = static_cast<uint32_t>(indices[0].size());
query_vector.ids_ = indices[0].data();
query_vector.vals_ = values[0].data();
auto query = vsag::Dataset::Make();
query->NumElements(1)->SparseVectors(&query_vector)->Owner(false);
const std::string search_params =
R"({"sindi": {"query_prune_ratio": 0, "n_candidate": 100}})";
auto range_result =
index->RangeSearch(query, 1.0f, search_params, /limited_size=/-1);
auto result = range_result.value();
for (int64_t i = 0; i < result->GetDim(); ++i) {
std::cout << "id: " << result->GetIds()[i]
<< ", distance: " << result->GetDistances()[i] << '\n';
}
Environment
- OS: Alibaba Cloud Linux 3
- vsag version: v0.18.8
- compiler version: c++ (GCC) 10.2.1 20200825 (Alibaba 10.2.1-3.9 2.32)
Expected behavior
return unique results
Actual behavior
References
No response
Additional context
No response
Affected area
sindi
Interface
cpp
VSAG version
v0.18.8
Summary
range search on sindi return repeated results
Minimal reproducer
vsag::Resource resource;
vsag::Engine engine(&resource);
const std::string build_params = R"({
"dtype": "sparse",
"dim": 3,
"metric_type": "ip",
"index_param": {
"use_reorder": true,
"term_id_limit": 4000,
"doc_prune_ratio": 0,
"window_size": 60000,
"use_quantization": false
}
})";
auto create_result = engine.CreateIndex("sindi", build_params);
auto index = create_result.value();
std::vector<std::vector<uint32_t>> indices = {
{5, 100, 2000}, {5, 50, 2000}, {10, 100, 3000}};
std::vector<std::vector> values = {
{0.5f, 0.8f, 0.6f}, {0.3f, 0.9f, 0.1f}, {0.7f, 0.4f, 0.5f}};
std::vector<int64_t> ids = {1, 2, 3};
for (size_t i = 0; i < ids.size(); ++i) {
vsag::SparseVector sparse_vector;
sparse_vector.len_ = static_cast<uint32_t>(indices[i].size());
sparse_vector.ids_ = indices[i].data();
sparse_vector.vals_ = values[i].data();
auto dataset = vsag::Dataset::Make();
dataset->NumElements(1)
->Ids(&ids[i])
->SparseVectors(&sparse_vector)
->Owner(false);
auto add_result = index->Add(dataset);
}
vsag::SparseVector query_vector;
query_vector.len_ = static_cast<uint32_t>(indices[0].size());
query_vector.ids_ = indices[0].data();
query_vector.vals_ = values[0].data();
auto query = vsag::Dataset::Make();
query->NumElements(1)->SparseVectors(&query_vector)->Owner(false);
const std::string search_params =
R"({"sindi": {"query_prune_ratio": 0, "n_candidate": 100}})";
auto range_result =
index->RangeSearch(query, 1.0f, search_params, /limited_size=/-1);
auto result = range_result.value();
for (int64_t i = 0; i < result->GetDim(); ++i) {
std::cout << "id: " << result->GetIds()[i]
<< ", distance: " << result->GetDistances()[i] << '\n';
}
Environment
Expected behavior
return unique results
Actual behavior
References
No response
Additional context
No response