索引简介
索引的作用是加速大型数据集上的查询。
目前,向量字段仅支持一种索引类型,即只能创建一个索引。
milvus支持的向量索引类型大部分使用近似最近邻搜索算法(ANNS,approximate nearest neighbors search) 。ANNS 的核心思想不再局限于返回最准确的结果,而是仅搜索目标的邻居。 ANNS 通过在可接受的范围内牺牲准确性来提高检索效率。
IVF_PQ索引
索引IndexFlatL2和IndexIVFFlat存储完整的向量。为了扩展到非常大的数据集,Faiss 提供了基于乘积量化的有损压缩来压缩存储的向量的变体。
压缩基于Product Quantizer,应用于要编码的向量的子向量。
Product Quantization是一种有效的量化方法,它通过将高维向量切分为若干子向量,然后分别对子向量进行量化,最终将子向量的量化结果组合成新的低维码本,从而实现数据的压缩。
把向量用质心编码表示,即量化。质心代表聚类中的所有向量。
PQ的主要目的是节省了大量内存。也能提升速度,但并不多。
IVF_PQ 在量化向量的乘积之前执行 IVF 索引聚类。
索引构建参数:
m:乘积量化因子数,表示每个向量被分成多少个子向量
nlist:集群单元数量
nbits:每个向量用多少位表示
使用attu创建IVF_PQ索引
使用pymilvus创建IVF_PQ索引
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_PQ","metric_type": "L2","params": {"nlist": 64,"m": 16,"nbits": 8}
}coll.create_index(field_name="embeddings",index_params=index_params,index_name="idx_em"
)print("done")