索引简介
索引的作用是加速大型数据集上的查询。
目前,向量字段仅支持一种索引类型,即只能创建一个索引。
milvus支持的向量索引类型大部分使用近似最近邻搜索算法(ANNS,approximate nearest neighbors search) 。ANNS 的核心思想不再局限于返回最准确的结果,而是仅搜索目标的邻居。 ANNS 通过在可接受的范围内牺牲准确性来提高检索效率。
IVF_SQ8索引
由于IVF_FLAT未对原始的向量数据做任何压缩,IVF_FLAT索引文件的大小与原始数据文件大小相当。例如sift-1b数据集原始数据文件的大小为476GB,生成的IVFFLAT索引文件大小有470GB左右,若将全部索引文件加载进内存,就需要470GB的内存资源。
当磁盘或内存、显存资源有限时,IVFSQ8是一个更好的选择。它通过对向量进行标量量化(Scalar Quantization),能把原始向量中每个FLOAT(4字节)转为UINT8(1字节),从而可以把磁盘及内存、显存资源的消耗量减少70% ~ 75%。同样以sift-1b数据集为例,生成的IVFSQ8索引文件只有140GB。
优点:查询速度快,资源占用仅为IVFFLAT的1/4~1/3
缺点:查询召回率比IVFFLAT低
索引构建参数:
nlist:集群单元数量
使用attu创建IVF_SQ8索引
使用pymilvus创建IVF_SQ8索引
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_SQ8",
"metric_type": "L2",
"params": {
"nlist": 64
}
}
coll.create_index(
field_name="embeddings",
index_params=index_params,
index_name="idx_em"
)
print("done")