未验证 提交 c1e8406c 编写于 作者: G Gao 提交者: GitHub

Override index type as AUTOINDEX when autoindex is enabled (#23744)

Signed-off-by: Nchasingegg <gaoc96@qq.com>
上级 5a9a86ba
......@@ -132,14 +132,10 @@ func (cit *createIndexTask) parseIndexParams() error {
if isVecIndex {
specifyIndexType, exist := indexParamsMap[common.IndexTypeKey]
if Params.AutoIndexConfig.Enable.GetAsBool() {
if exist {
if specifyIndexType != AutoIndexName {
return fmt.Errorf("IndexType should be %s", AutoIndexName)
}
}
log.Debug("create index trigger AutoIndex",
zap.String("type", Params.AutoIndexConfig.AutoIndexTypeName.GetValue()))
// override params
log.Info("create index trigger AutoIndex",
zap.String("original type", specifyIndexType),
zap.String("final type", Params.AutoIndexConfig.AutoIndexTypeName.GetValue()))
// override params by autoindex
for k, v := range Params.AutoIndexConfig.IndexParams.GetAsJSONMap() {
indexParamsMap[k] = v
}
......
......@@ -18,6 +18,7 @@ package proxy
import (
"context"
"encoding/json"
"os"
"testing"
......@@ -358,4 +359,101 @@ func Test_parseIndexParams(t *testing.T) {
},
}, cit.newTypeParams)
})
cit2 := &createIndexTask{
Condition: nil,
req: &milvuspb.CreateIndexRequest{
Base: nil,
DbName: "",
CollectionName: "",
FieldName: "",
ExtraParams: []*commonpb.KeyValuePair{
{
Key: "index_type",
Value: "IVF_FLAT",
},
{
Key: MetricTypeKey,
Value: "L2",
},
{
Key: "params",
Value: "{\"nlist\": 100}",
},
{
Key: DimKey,
Value: "128",
},
},
IndexName: "",
},
ctx: nil,
rootCoord: nil,
queryCoord: nil,
result: nil,
isAutoIndex: false,
newIndexParams: nil,
newTypeParams: nil,
collectionID: 0,
fieldSchema: &schemapb.FieldSchema{
FieldID: 101,
Name: "FieldID",
IsPrimaryKey: false,
Description: "field no.1",
DataType: schemapb.DataType_FloatVector,
TypeParams: []*commonpb.KeyValuePair{
{
Key: DimKey,
Value: "128",
},
{
Key: MetricTypeKey,
Value: "L2",
},
}},
}
t.Run("parse index params 2", func(t *testing.T) {
Params.Save(Params.AutoIndexConfig.Enable.Key, "true")
indexParams := map[string]any{
"index_type": "HNSW",
"M": 10,
"efConstruction": 100,
}
indexParamsStr, err := json.Marshal(indexParams)
assert.NoError(t, err)
Params.Save(Params.AutoIndexConfig.IndexParams.Key, string(indexParamsStr))
err = cit2.parseIndexParams()
assert.NoError(t, err)
assert.ElementsMatch(t,
[]*commonpb.KeyValuePair{
{
Key: "index_type",
Value: "HNSW",
},
{
Key: MetricTypeKey,
Value: "L2",
},
{
Key: "M",
Value: "10",
},
{
Key: "efConstruction",
Value: "100",
},
{
Key: "nlist",
Value: "100",
},
}, cit2.newIndexParams)
assert.ElementsMatch(t,
[]*commonpb.KeyValuePair{
{
Key: DimKey,
Value: "128",
},
}, cit2.newTypeParams)
})
}
......@@ -1744,6 +1744,37 @@ class TestCollectionSearch(TestcaseBase):
"limit": default_limit,
"_async": _async})
@pytest.mark.tags(CaseLabel.L1)
@pytest.mark.parametrize("M", [4, 64])
@pytest.mark.parametrize("efConstruction", [8, 512])
def test_search_HNSW_index_with_redundant_param(self, M, efConstruction, auto_id, _async):
"""
target: test search HNSW index with redundant param
method: connect milvus, create collection , insert, create index, load and search
expected: search successfully
"""
dim = M * 4
self._connect()
collection_w, _, _, insert_ids, time_stamp = self.init_collection_general(prefix, True,
partition_num=1,
auto_id=auto_id,
dim=dim, is_index=False)[0:5]
HNSW_index_params = {"M": M, "efConstruction": efConstruction, "nlist": 100} # nlist is of no use
HNSW_index = {"index_type": "HNSW", "params": HNSW_index_params, "metric_type": "L2"}
collection_w.create_index("float_vector", HNSW_index)
collection_w.load()
search_param = {"metric_type": "L2", "params": {"ef": 32768, "nprobe": 10}} # nprobe is of no use
vectors = [[random.random() for _ in range(dim)] for _ in range(default_nq)]
collection_w.search(vectors[:default_nq], default_search_field,
search_param, default_limit,
default_search_exp, _async=_async,
travel_timestamp=0,
check_task=CheckTasks.check_search_results,
check_items={"nq": default_nq,
"ids": insert_ids,
"limit": default_limit,
"_async": _async})
@pytest.mark.tags(CaseLabel.L1)
@pytest.mark.parametrize("M", [4, 64])
@pytest.mark.parametrize("efConstruction", [8, 512])
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册