Fix prefix match on sealed segment (#17050)

Signed-off-by: dragondriver <jiquan.long@zilliz.com>
pull/16882/head
Jiquan Long 2022-05-17 20:15:55 +08:00 committed by GitHub
parent 3cab89c178
commit 77b0f290a8
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
2 changed files with 16 additions and 1 deletions

View File

@ -13,7 +13,8 @@
#include <memory>
#include <string>
#include <index/ScalarIndexSort.h>
#include "index/ScalarIndexSort.h"
#include "index/StringIndexSort.h"
#include "common/FieldMeta.h"
#include "common/Span.h"
@ -28,6 +29,14 @@ generate_scalar_index(Span<T> data) {
return indexing;
}
template <>
inline scalar::ScalarIndexPtr<std::string>
generate_scalar_index(Span<std::string> data) {
auto indexing = scalar::CreateStringIndexSort();
indexing->Build(data.row_count(), data.data());
return indexing;
}
inline std::unique_ptr<knowhere::Index>
generate_scalar_index(SpanBase data, DataType data_type) {
Assert(!datatype_is_vector(data_type));

View File

@ -222,6 +222,7 @@ TEST(Sealed, LoadFieldData) {
auto counter_id = schema->AddDebugField("counter", DataType::INT64);
auto double_id = schema->AddDebugField("double", DataType::DOUBLE);
auto nothing_id = schema->AddDebugField("nothing", DataType::INT32);
auto str_id = schema->AddDebugField("str", DataType::VARCHAR);
schema->set_primary_field_id(counter_id);
auto dataset = DataGen(schema, N);
@ -281,13 +282,18 @@ TEST(Sealed, LoadFieldData) {
segment->LoadIndex(vec_info);
ASSERT_EQ(segment->num_chunk(), 1);
ASSERT_EQ(segment->num_chunk_index(double_id), 1);
ASSERT_EQ(segment->num_chunk_index(str_id), 1);
auto chunk_span1 = segment->chunk_data<int64_t>(counter_id, 0);
auto chunk_span2 = segment->chunk_data<double>(double_id, 0);
auto chunk_span3 = segment->chunk_data<std::string>(str_id, 0);
auto ref1 = dataset.get_col<int64_t>(counter_id);
auto ref2 = dataset.get_col<double>(double_id);
auto ref3 = dataset.get_col(str_id)->scalars().string_data().data();
for (int i = 0; i < N; ++i) {
ASSERT_EQ(chunk_span1[i], ref1[i]);
ASSERT_EQ(chunk_span2[i], ref2[i]);
ASSERT_EQ(chunk_span3[i], ref3[i]);
}
auto sr = segment->Search(plan.get(), *ph_group, time);