索引简介
索引的作用是加速大型数据集上的查询。
目前,向量字段仅支持一种索引类型,即只能创建一个索引。
milvus支持的向量索引类型大部分使用近似最近邻搜索算法(ANNS,approximate nearest neighbors search) 。ANNS 的核心思想不再局限于返回最准确的结果,而是仅搜索目标的邻居。 ANNS 通过在可接受的范围内牺牲准确性来提高检索效率。
索引分类
milvus支持内存索引、磁盘索引。
根据实现方法,ANNS向量索引可以分为4类:
- 基于树的索引
- 基于图的索引
- 基于哈希的索引
- 基于量化的索引
根据数据类型,支持2种类型的索引:
-
floating-point embeddings
SCANN、IVF_FLAT、IVF_PQ、IVF_SQ8、FLAT、HNSW、ANNOY、AUTOINDEX、DISKANN
-
binary embeddings
BIN_FLAT、BIN_IVF_FLAT
创建索引
使用attu创建hnsw索引
索引类型选择HNSW。
度量类型有3种:
-
L2(欧式距离)
本质上,欧几里得距离测量连接 2 个点的线段的长度。
-
IP(内积,点积)
如果您使用 IP 来计算相似度,则必须对其进行标准化。归一化后,内积等于余弦相似度。
-
COSINE(余弦相似度)
余弦相似度使用两组向量之间的角度的余弦来衡量它们的相似程度。
使用pymilvus创建索引
在向量字段创建一个hnsw类型的索引:
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": "HNSW",
"metric_type": "L2",
"params": {
"M": 16,
"efConstruction": 60
}
}
coll.create_index(
field_name="embeddings",
index_params=index_params,
index_name="idx_em"
)
print("done")