diff --git a/internal/core/src/indexbuilder/IndexWrapper.cpp b/internal/core/src/indexbuilder/IndexWrapper.cpp index ed37ec5a04a12e1a1c547f0113665696ccda0c6a..f23fcbd945a8b075fe5ae0d1328141bf373af853 100644 --- a/internal/core/src/indexbuilder/IndexWrapper.cpp +++ b/internal/core/src/indexbuilder/IndexWrapper.cpp @@ -25,8 +25,6 @@ namespace indexbuilder { IndexWrapper::IndexWrapper(const char* serialized_type_params, const char* serialized_index_params) { type_params_ = std::string(serialized_type_params); index_params_ = std::string(serialized_index_params); - // std::cout << "type_params_.size(): " << type_params_.size() << std::endl; - // std::cout << "index_params_.size(): " << index_params_.size() << std::endl; parse(); diff --git a/internal/core/src/indexbuilder/index_c.cpp b/internal/core/src/indexbuilder/index_c.cpp index 9adf504e33f691f8f4ef77e257be8587e79239bf..b21dd7cd05fcec73b449a9ed8eafa1c2feab7f44 100644 --- a/internal/core/src/indexbuilder/index_c.cpp +++ b/internal/core/src/indexbuilder/index_c.cpp @@ -28,13 +28,6 @@ class CGODebugUtils { CIndex CreateIndex(const char* serialized_type_params, const char* serialized_index_params) { - // std::cout << "strlen(serialized_type_params): " << CGODebugUtils::Strlen(serialized_type_params, - // type_params_size) - // << std::endl; - // std::cout << "type_params_size: " << type_params_size << std::endl; - // std::cout << "strlen(serialized_index_params): " - // << CGODebugUtils::Strlen(serialized_index_params, index_params_size) << std::endl; - // std::cout << "index_params_size: " << index_params_size << std::endl; auto index = std::make_unique<milvus::indexbuilder::IndexWrapper>(serialized_type_params, serialized_index_params); return index.release(); diff --git a/internal/core/unittest/test_index_wrapper.cpp b/internal/core/unittest/test_index_wrapper.cpp index ffbc340f862a1e72da3be7c053cef44cfd3ddaca..74eed0418e1989673f70cad7088807ca546ee33d 100644 --- a/internal/core/unittest/test_index_wrapper.cpp +++ b/internal/core/unittest/test_index_wrapper.cpp @@ -12,6 +12,7 @@ #include <tuple> #include <map> #include <gtest/gtest.h> +#include <google/protobuf/text_format.h> #include "pb/index_cgo_msg.pb.h" #include "index/knowhere/knowhere/index/vector_index/helpers/IndexParameter.h" @@ -116,9 +117,9 @@ class IndexWrapperTest : public ::testing::TestWithParam<Param> { is_binary = is_binary_map[index_type]; bool ok; - ok = type_params.SerializeToString(&type_params_str); + ok = google::protobuf::TextFormat::PrintToString(type_params, &type_params_str); assert(ok); - ok = index_params.SerializeToString(&index_params_str); + ok = google::protobuf::TextFormat::PrintToString(index_params, &index_params_str); assert(ok); auto dataset = GenDataset(NB, metric_type, is_binary); @@ -190,99 +191,71 @@ TEST(BINIDMAP, Build) { ASSERT_NO_THROW(index->BuildAll(xb_dataset, conf)); } -// TEST(PQWrapper, Build) { -// auto index_type = milvus::knowhere::IndexEnum::INDEX_FAISS_IVFPQ; -// auto metric_type = milvus::knowhere::Metric::L2; -// indexcgo::TypeParams type_params; -// indexcgo::IndexParams index_params; -// std::tie(type_params, index_params) = generate_params(index_type, metric_type); -// std::string type_params_str, index_params_str; -// bool ok; -// ok = type_params.SerializeToString(&type_params_str); -// assert(ok); -// ok = index_params.SerializeToString(&index_params_str); -// assert(ok); -// auto dataset = GenDataset(NB, metric_type, false); -// auto xb_data = dataset.get_col<float>(0); -// auto xb_dataset = milvus::knowhere::GenDataset(NB, DIM, xb_data.data()); -// auto index = std::make_unique<milvus::indexbuilder::IndexWrapper>( -// type_params_str.c_str(), type_params_str.size(), index_params_str.c_str(), index_params_str.size()); -// ASSERT_NO_THROW(index->BuildWithoutIds(xb_dataset)); -//} - -// TEST(PQCGO, Params) { -// std::vector<char> type_params; -// std::vector<char> index_params{10, 10, 10, 5, 110, 98, 105, 116, 115, 18, 1, 56, 10, 17, 10, 11, 109, -// 101, 116, 114, 105, 99, 95, 116, 121, 112, 101, 18, 2, 76, 50, 10, 20, 10, -// 10, 105, 110, 100, 101, 120, 95, 116, 121, 112, 101, 18, 6, 73, 86, 70, 95, -// 80, 81, 10, 8, 10, 3, 100, 105, 109, 18, 1, 56, 10, 12, 10, 5, 110, -// 108, 105, 115, 116, 18, 3, 49, 48, 48, 10, 6, 10, 1, 109, 18, 1, 52}; -// auto index = std::make_unique<milvus::indexbuilder::IndexWrapper>(type_params.data(), type_params.size(), -// index_params.data(), index_params.size()); -// -// auto dim = index->dim(); -// auto dataset = GenDataset(NB, METRIC_TYPE, false, dim); -// auto xb_data = dataset.get_col<float>(0); -// auto xb_dataset = milvus::knowhere::GenDataset(NB, DIM, xb_data.data()); -// ASSERT_NO_THROW(index->BuildWithoutIds(xb_dataset)); -//} - -// TEST(PQCGOWrapper, Params) { -// std::vector<char> type_params; -// std::vector<char> index_params{10, 10, 10, 5, 110, 98, 105, 116, 115, 18, 1, 56, 10, 17, 10, 11, 109, -// 101, 116, 114, 105, 99, 95, 116, 121, 112, 101, 18, 2, 76, 50, 10, 20, 10, -// 10, 105, 110, 100, 101, 120, 95, 116, 121, 112, 101, 18, 6, 73, 86, 70, 95, -// 80, 81, 10, 8, 10, 3, 100, 105, 109, 18, 1, 56, 10, 12, 10, 5, 110, -// 108, 105, 115, 116, 18, 3, 49, 48, 48, 10, 6, 10, 1, 109, 18, 1, 52}; -// auto index = CreateIndex(type_params.data(), type_params.size(), index_params.data(), index_params.size()); -// DeleteIndex(index); -//} - -// TEST(BinFlatWrapper, Build) { -// auto index_type = milvus::knowhere::IndexEnum::INDEX_FAISS_BIN_IVFFLAT; -// auto metric_type = milvus::knowhere::Metric::JACCARD; -// indexcgo::TypeParams type_params; -// indexcgo::IndexParams index_params; -// std::tie(type_params, index_params) = generate_params(index_type, metric_type); -// std::string type_params_str, index_params_str; -// bool ok; -// ok = type_params.SerializeToString(&type_params_str); -// assert(ok); -// ok = index_params.SerializeToString(&index_params_str); -// assert(ok); -// auto dataset = GenDataset(NB, metric_type, true); -// auto xb_data = dataset.get_col<uint8_t>(0); -// std::vector<milvus::knowhere::IDType> ids(NB, 0); -// std::iota(ids.begin(), ids.end(), 0); -// auto xb_dataset = milvus::knowhere::GenDatasetWithIds(NB, DIM, xb_data.data(), ids.data()); -// auto index = std::make_unique<milvus::indexbuilder::IndexWrapper>( -// type_params_str.c_str(), type_params_str.size(), index_params_str.c_str(), index_params_str.size()); -// ASSERT_ANY_THROW(index->BuildWithoutIds(xb_dataset)); -// ASSERT_NO_THROW(index->BuildWithIds(xb_dataset)); -//} - -// TEST(BinIdMapWrapper, Build) { -// auto index_type = milvus::knowhere::IndexEnum::INDEX_FAISS_BIN_IDMAP; -// auto metric_type = milvus::knowhere::Metric::JACCARD; -// indexcgo::TypeParams type_params; -// indexcgo::IndexParams index_params; -// std::tie(type_params, index_params) = generate_params(index_type, metric_type); -// std::string type_params_str, index_params_str; -// bool ok; -// ok = type_params.SerializeToString(&type_params_str); -// assert(ok); -// ok = index_params.SerializeToString(&index_params_str); -// assert(ok); -// auto dataset = GenDataset(NB, metric_type, true); -// auto xb_data = dataset.get_col<uint8_t>(0); -// std::vector<milvus::knowhere::IDType> ids(NB, 0); -// std::iota(ids.begin(), ids.end(), 0); -// auto xb_dataset = milvus::knowhere::GenDatasetWithIds(NB, DIM, xb_data.data(), ids.data()); -// auto index = std::make_unique<milvus::indexbuilder::IndexWrapper>( -// type_params_str.c_str(), type_params_str.size(), index_params_str.c_str(), index_params_str.size()); -// ASSERT_NO_THROW(index->BuildWithoutIds(xb_dataset)); -// ASSERT_NO_THROW(index->BuildWithIds(xb_dataset)); -//} +TEST(PQWrapper, Build) { + auto index_type = milvus::knowhere::IndexEnum::INDEX_FAISS_IVFPQ; + auto metric_type = milvus::knowhere::Metric::L2; + indexcgo::TypeParams type_params; + indexcgo::IndexParams index_params; + std::tie(type_params, index_params) = generate_params(index_type, metric_type); + std::string type_params_str, index_params_str; + bool ok; + ok = google::protobuf::TextFormat::PrintToString(type_params, &type_params_str); + assert(ok); + ok = google::protobuf::TextFormat::PrintToString(index_params, &index_params_str); + assert(ok); + auto dataset = GenDataset(NB, metric_type, false); + auto xb_data = dataset.get_col<float>(0); + auto xb_dataset = milvus::knowhere::GenDataset(NB, DIM, xb_data.data()); + auto index = + std::make_unique<milvus::indexbuilder::IndexWrapper>(type_params_str.c_str(), index_params_str.c_str()); + ASSERT_NO_THROW(index->BuildWithoutIds(xb_dataset)); +} + +TEST(BinFlatWrapper, Build) { + auto index_type = milvus::knowhere::IndexEnum::INDEX_FAISS_BIN_IVFFLAT; + auto metric_type = milvus::knowhere::Metric::JACCARD; + indexcgo::TypeParams type_params; + indexcgo::IndexParams index_params; + std::tie(type_params, index_params) = generate_params(index_type, metric_type); + std::string type_params_str, index_params_str; + bool ok; + ok = google::protobuf::TextFormat::PrintToString(type_params, &type_params_str); + assert(ok); + ok = google::protobuf::TextFormat::PrintToString(index_params, &index_params_str); + assert(ok); + auto dataset = GenDataset(NB, metric_type, true); + auto xb_data = dataset.get_col<uint8_t>(0); + std::vector<milvus::knowhere::IDType> ids(NB, 0); + std::iota(ids.begin(), ids.end(), 0); + auto xb_dataset = milvus::knowhere::GenDatasetWithIds(NB, DIM, xb_data.data(), ids.data()); + auto index = + std::make_unique<milvus::indexbuilder::IndexWrapper>(type_params_str.c_str(), index_params_str.c_str()); + ASSERT_ANY_THROW(index->BuildWithoutIds(xb_dataset)); + ASSERT_NO_THROW(index->BuildWithIds(xb_dataset)); +} + +TEST(BinIdMapWrapper, Build) { + auto index_type = milvus::knowhere::IndexEnum::INDEX_FAISS_BIN_IDMAP; + auto metric_type = milvus::knowhere::Metric::JACCARD; + indexcgo::TypeParams type_params; + indexcgo::IndexParams index_params; + std::tie(type_params, index_params) = generate_params(index_type, metric_type); + std::string type_params_str, index_params_str; + bool ok; + ok = google::protobuf::TextFormat::PrintToString(type_params, &type_params_str); + assert(ok); + ok = google::protobuf::TextFormat::PrintToString(index_params, &index_params_str); + assert(ok); + auto dataset = GenDataset(NB, metric_type, true); + auto xb_data = dataset.get_col<uint8_t>(0); + std::vector<milvus::knowhere::IDType> ids(NB, 0); + std::iota(ids.begin(), ids.end(), 0); + auto xb_dataset = milvus::knowhere::GenDatasetWithIds(NB, DIM, xb_data.data(), ids.data()); + auto index = + std::make_unique<milvus::indexbuilder::IndexWrapper>(type_params_str.c_str(), index_params_str.c_str()); + ASSERT_NO_THROW(index->BuildWithoutIds(xb_dataset)); + ASSERT_NO_THROW(index->BuildWithIds(xb_dataset)); +} INSTANTIATE_TEST_CASE_P(IndexTypeParameters, IndexWrapperTest, @@ -293,46 +266,46 @@ INSTANTIATE_TEST_CASE_P(IndexTypeParameters, std::pair(milvus::knowhere::IndexEnum::INDEX_FAISS_BIN_IDMAP, milvus::knowhere::Metric::JACCARD))); -// TEST_P(IndexWrapperTest, Constructor) { -// auto index = std::make_unique<milvus::indexbuilder::IndexWrapper>( -// type_params_str.c_str(), type_params_str.size(), index_params_str.c_str(), index_params_str.size()); -//} +TEST_P(IndexWrapperTest, Constructor) { + auto index = + std::make_unique<milvus::indexbuilder::IndexWrapper>(type_params_str.c_str(), index_params_str.c_str()); +} -// TEST_P(IndexWrapperTest, Dim) { -// auto index = std::make_unique<milvus::indexbuilder::IndexWrapper>( -// type_params_str.c_str(), type_params_str.size(), index_params_str.c_str(), index_params_str.size()); -// -// ASSERT_EQ(index->dim(), DIM); -//} +TEST_P(IndexWrapperTest, Dim) { + auto index = + std::make_unique<milvus::indexbuilder::IndexWrapper>(type_params_str.c_str(), index_params_str.c_str()); -// TEST_P(IndexWrapperTest, BuildWithoutIds) { -// auto index = std::make_unique<milvus::indexbuilder::IndexWrapper>( -// type_params_str.c_str(), type_params_str.size(), index_params_str.c_str(), index_params_str.size()); -// -// if (index_type == milvus::knowhere::IndexEnum::INDEX_FAISS_BIN_IVFFLAT) { -// ASSERT_ANY_THROW(index->BuildWithoutIds(xb_dataset)); -// } else { -// ASSERT_NO_THROW(index->BuildWithoutIds(xb_dataset)); -// } -//} - -// TEST_P(IndexWrapperTest, Codec) { -// auto index = std::make_unique<milvus::indexbuilder::IndexWrapper>( -// type_params_str.c_str(), type_params_str.size(), index_params_str.c_str(), index_params_str.size()); -// -// if (index_type == milvus::knowhere::IndexEnum::INDEX_FAISS_BIN_IVFFLAT) { -// ASSERT_ANY_THROW(index->BuildWithoutIds(xb_dataset)); -// ASSERT_NO_THROW(index->BuildWithIds(xb_dataset)); -// } else { -// ASSERT_NO_THROW(index->BuildWithoutIds(xb_dataset)); -// } -// -// auto binary = index->Serialize(); -// auto copy_index = std::make_unique<milvus::indexbuilder::IndexWrapper>( -// type_params_str.c_str(), type_params_str.size(), index_params_str.c_str(), index_params_str.size()); -// ASSERT_NO_THROW(copy_index->Load(binary.data, binary.size)); -// ASSERT_EQ(copy_index->dim(), copy_index->dim()); -// auto copy_binary = copy_index->Serialize(); -// ASSERT_EQ(binary.size, copy_binary.size); -// ASSERT_EQ(strcmp(binary.data, copy_binary.data), 0); -//} + ASSERT_EQ(index->dim(), DIM); +} + +TEST_P(IndexWrapperTest, BuildWithoutIds) { + auto index = + std::make_unique<milvus::indexbuilder::IndexWrapper>(type_params_str.c_str(), index_params_str.c_str()); + + if (index_type == milvus::knowhere::IndexEnum::INDEX_FAISS_BIN_IVFFLAT) { + ASSERT_ANY_THROW(index->BuildWithoutIds(xb_dataset)); + } else { + ASSERT_NO_THROW(index->BuildWithoutIds(xb_dataset)); + } +} + +TEST_P(IndexWrapperTest, Codec) { + auto index = + std::make_unique<milvus::indexbuilder::IndexWrapper>(type_params_str.c_str(), index_params_str.c_str()); + + if (index_type == milvus::knowhere::IndexEnum::INDEX_FAISS_BIN_IVFFLAT) { + ASSERT_ANY_THROW(index->BuildWithoutIds(xb_dataset)); + ASSERT_NO_THROW(index->BuildWithIds(xb_dataset)); + } else { + ASSERT_NO_THROW(index->BuildWithoutIds(xb_dataset)); + } + + auto binary = index->Serialize(); + auto copy_index = + std::make_unique<milvus::indexbuilder::IndexWrapper>(type_params_str.c_str(), index_params_str.c_str()); + ASSERT_NO_THROW(copy_index->Load(binary.data, binary.size)); + ASSERT_EQ(copy_index->dim(), copy_index->dim()); + auto copy_binary = copy_index->Serialize(); + ASSERT_EQ(binary.size, copy_binary.size); + ASSERT_EQ(strcmp(binary.data, copy_binary.data), 0); +} diff --git a/internal/indexbuilder/index.go b/internal/indexbuilder/index.go index 0ed411df4d3e4ceff3c81a39b9a1a420c07f5aeb..f79543a4225013319e0b403d2c207b9ff6967648 100644 --- a/internal/indexbuilder/index.go +++ b/internal/indexbuilder/index.go @@ -123,30 +123,13 @@ func NewCIndex(typeParams, indexParams map[string]string) (Index, error) { } indexParamsStr := proto.MarshalTextString(protoIndexParams) - //print := func(param []byte) { - // for i, c := range param { - // fmt.Print(c) - // fmt.Print(", ") - // if i % 25 == 0 { - // fmt.Println() - // } - // } - // fmt.Println() - //} - //print(typeParamsStr) - //fmt.Println("len(typeParamsStr): ", len(typeParamsStr)) - //print(indexParamsStr) - //fmt.Println("len(indexParamsStr): ", len(indexParamsStr)) - typeParamsPointer := C.CString(typeParamsStr) indexParamsPointer := C.CString(indexParamsStr) /* CIndex CreateIndex(const char* serialized_type_params, - int64_t type_params_size, - const char* serialized_index_params - int64_t index_params_size); + const char* serialized_index_params); */ return &CIndex{ indexPtr: C.CreateIndex(typeParamsPointer, indexParamsPointer), diff --git a/internal/indexbuilder/index_test.go b/internal/indexbuilder/index_test.go index a5e5eb2ca5e3d1e90ea6c1b589e295e373801d6f..3ece0330d781ab22fbdfeb590581ffca79d91fdf 100644 --- a/internal/indexbuilder/index_test.go +++ b/internal/indexbuilder/index_test.go @@ -2,33 +2,168 @@ package indexbuilder import ( "github.com/stretchr/testify/assert" + "math/rand" "strconv" "testing" ) const ( - indexType = "IVF_PQ" - dim = 8 - nlist = 100 - m = 4 - nbits = 8 - metricType = "L2" + IvfPq = "IVF_PQ" + BinFlat = "BIN_FLAT" + dim = 8 + nlist = 100 + m = 4 + nbits = 8 + L2 = "L2" + Jaccard = "JACCARD" + nb = 8 * 10000 ) -func TestIndex_New(t *testing.T) { +type testCase struct { + indexType string + metricType string + isBinary bool +} + +func generateFloatVectorTestCases() []testCase { + return []testCase{ + {IvfPq, L2, false}, + } +} + +func generateBinaryVectorTestCases() []testCase { + return []testCase{ + {BinFlat, Jaccard, true}, + } +} + +func generateTestCases() []testCase { + return append(generateFloatVectorTestCases(), generateBinaryVectorTestCases()...) +} + +func generateParams(indexType, metricType string) (map[string]string, map[string]string) { typeParams := make(map[string]string) indexParams := make(map[string]string) indexParams["index_type"] = indexType - indexParams["dim"] = strconv.Itoa(dim) - indexParams["nlist"] = strconv.Itoa(nlist) - indexParams["m"] = strconv.Itoa(m) - indexParams["nbits"] = strconv.Itoa(nbits) indexParams["metric_type"] = metricType + if indexType == IvfPq { + indexParams["dim"] = strconv.Itoa(dim) + indexParams["nlist"] = strconv.Itoa(nlist) + indexParams["m"] = strconv.Itoa(m) + indexParams["nbits"] = strconv.Itoa(nbits) + } else if indexType == BinFlat { + indexParams["dim"] = strconv.Itoa(dim) + } + + return typeParams, indexParams +} + +func generateFloatVectors() []float32 { + vectors := make([]float32, 0) + for i := 0; i < nb; i++ { + vectors = append(vectors, rand.Float32()) + } + return vectors +} + +func generateBinaryVectors() []byte { + vectors := make([]byte, 0) + for i := 0; i < nb/8; i++ { + vectors = append(vectors, byte(rand.Intn(8))) + } + return vectors +} + +func TestCIndex_New(t *testing.T) { + for _, c := range generateTestCases() { + typeParams, indexParams := generateParams(c.indexType, c.metricType) + + index, err := NewCIndex(typeParams, indexParams) + assert.Equal(t, err, nil) + assert.NotEqual(t, index, nil) + + err = index.Delete() + assert.Equal(t, err, nil) + } +} + +func TestCIndex_BuildFloatVecIndexWithoutIds(t *testing.T) { + for _, c := range generateFloatVectorTestCases() { + typeParams, indexParams := generateParams(c.indexType, c.metricType) + + index, err := NewCIndex(typeParams, indexParams) + assert.Equal(t, err, nil) + assert.NotEqual(t, index, nil) + + vectors := generateFloatVectors() + err = index.BuildFloatVecIndexWithoutIds(vectors) + assert.Equal(t, err, nil) + + err = index.Delete() + assert.Equal(t, err, nil) + } +} + +func TestCIndex_BuildBinaryVecIndexWithoutIds(t *testing.T) { + for _, c := range generateBinaryVectorTestCases() { + typeParams, indexParams := generateParams(c.indexType, c.metricType) + + index, err := NewCIndex(typeParams, indexParams) + assert.Equal(t, err, nil) + assert.NotEqual(t, index, nil) + + vectors := generateBinaryVectors() + err = index.BuildBinaryVecIndexWithoutIds(vectors) + assert.Equal(t, err, nil) + + err = index.Delete() + assert.Equal(t, err, nil) + } +} + +func TestCIndex_Codec(t *testing.T) { + for _, c := range generateTestCases() { + typeParams, indexParams := generateParams(c.indexType, c.metricType) + + index, err := NewCIndex(typeParams, indexParams) + assert.Equal(t, err, nil) + assert.NotEqual(t, index, nil) + + if !c.isBinary { + vectors := generateFloatVectors() + err = index.BuildFloatVecIndexWithoutIds(vectors) + assert.Equal(t, err, nil) + } else { + vectors := generateBinaryVectors() + err = index.BuildBinaryVecIndexWithoutIds(vectors) + assert.Equal(t, err, nil) + } + + blobs, err := index.Serialize() + assert.Equal(t, err, nil) + + copyIndex, err := NewCIndex(typeParams, indexParams) + err = copyIndex.Load(blobs) + assert.Equal(t, err, nil) + copyBlobs, err := copyIndex.Serialize() + assert.Equal(t, err, nil) + assert.Equal(t, len(blobs), len(copyBlobs)) + // TODO: check key, value and more + + err = index.Delete() + assert.Equal(t, err, nil) + } +} + +func TestCIndex_Delete(t *testing.T) { + for _, c := range generateTestCases() { + typeParams, indexParams := generateParams(c.indexType, c.metricType) - index, err := NewCIndex(typeParams, indexParams) - assert.Equal(t, err, nil) - assert.NotEqual(t, index, nil) + index, err := NewCIndex(typeParams, indexParams) + assert.Equal(t, err, nil) + assert.NotEqual(t, index, nil) - err = index.Delete() - assert.Equal(t, err, nil) + err = index.Delete() + assert.Equal(t, err, nil) + } } diff --git a/internal/proxy/validate_util.go b/internal/proxy/validate_util.go index a094d5d5a104e97dd449d5e35790b3d40ed097bc..d659f45b42d05685d58a5084cfb39433c884dab7 100644 --- a/internal/proxy/validate_util.go +++ b/internal/proxy/validate_util.go @@ -130,7 +130,7 @@ func ValidateDimension(dim int64, isBinary bool) error { } func ValidateVectorFieldMetricType(field *schemapb.FieldSchema) error { - if (field.DataType != schemapb.DataType_VECTOR_FLOAT) && (field.DataType != schemapb.DataType_VECTOR_BINARY) { + if field.DataType != schemapb.DataType_VECTOR_FLOAT { return nil } for _, params := range field.IndexParams {