索引简介
索引的作用是加速大型数据集上的查询。
目前,向量字段仅支持一种索引类型,即只能创建一个索引。
milvus支持的向量索引类型大部分使用近似最近邻搜索算法(ANNS,approximate nearest neighbors search) 。ANNS 的核心思想不再局限于返回最准确的结果,而是仅搜索目标的邻居。 ANNS 通过在可接受的范围内牺牲准确性来提高检索效率。
IVF_FLAT索引
IVF_FLAT将向量数据划分为nlist
簇(cluster)单元,然后比较目标输入向量与每个簇中心之间的距离。
根据系统设置查询的簇数 ( nprobe
),根据目标输入与最相似簇中的向量之间的比较返回相似性搜索结果 - 大大减少查询时间。
通过调整nprobe,可以针对给定场景找到准确度和速度之间的理想平衡。IVF_FLAT 性能测试的结果表明,随着目标输入向量数量( nq,number of query)和要搜索的簇数量 ( nprobe) 的增加,查询时间急剧增加。
IVF_FLAT是最基本的IVF索引,每个单元存储的编码数据与原始数据一致。
倒排文件(Inverted File)是一种常用的索引结构,用于加速近似最近邻搜索。
IVF_FLAT索引的工作流程如下:
-
数据库中的向量被聚类成多个聚类,每个聚类中包含一组相似的向量。
-
建立倒排文件,将每个聚类的标识符和相应的向量列表保存起来。
-
对于每个聚类,构建Flat L2索引,以便能够快速找到聚类内部的最近邻居。
-
在搜索时,首先找到与查询向量相似度最高的聚类,然后在该聚类内使用Flat L2索引进行进一步搜索,找到最终的最近邻居。
使用attu创建IVF_FLAT索引
使用pymilvus创建IVF_FLAT索引
from pymilvus import (
connections,
Collection,
)
collection_name = "hello_milvus"
host = "192.168.230.71"
port = 19530
username = ""
password = ""
print("start connecting to Milvus")
connections.connect("default", host=host, port=port,user=username,password=password)
coll = Collection(collection_name, consistency_level="Bounded",shards_num=1)
print("Start creating index")
index_params = {
"index_type": "IVF_FLAT",
"metric_type": "L2",
"params": {
"nlist": 100
}
}
coll.create_index(
field_name="embeddings",
index_params=index_params,
index_name="idx_em"
)
print("done")