Milvus 是一款开源的向量相似度搜索引擎,支持针对 TB 级向量的增删改操作和近实时查询,具有高度灵活、稳定可靠以及高速查询等特点。Milvus 集成了 Faiss、NMSLIB、Annoy 等广泛应用的向量索引库,提供了一整套简单直观的 API,让你可以针对不同场景选择不同的索引类型。此外,Milvus 还可以对标量数据进行过滤,进一步提高了召回率,增强了搜索的灵活性。
特性
- 异构计算
- 优化了基于 GPU 搜索向量和建立索引的性能
- 可以在单台通用服务器上完成对 TB 级数据的毫秒级搜索
- 动态数据管理
- 支持主流索引库、距离计算方式和监控工具
- 集成了 Faiss、NMSLIB、Annoy 等向量索引库
- 支持基于量化的索引、基于图的索引和基于树的索引
- 相似度计算方式包括欧氏距离 (L2)、内积 (IP)、汉明距离、杰卡德距离等
- Prometheus 作为监控和性能指标存储方案,Grafana 作为可视化组件进行数据展示
- 近实时搜索
- 插入 Milvus 的数据默认在 1 秒后即可被搜索到
向量距离
欧式距离L2
内积
杰卡德距离
谷本距离
汉明距离
python SDK
pip3 install pymilvus
- 1
- 2
from milvus import Milvus, IndexType, MetricType, Status
milvus = Milvus(host='localhost', port='19530')
milvus = Milvus(uri='tcp://localhost:19530')
- 1
- 2
- 3
- 4
- 5
- 6
- 创建集合
- 创建集合名为 test01,维度为 256,自动创建索引的数据文件大小为 1024 MB,距离度量方式为欧氏距离(L2)的集合
param = {'collection_name':'test01', 'dimension':256, 'index_file_size':1024, 'metric_type':MetricType.L2}
milvus.create_collection(param)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 删除集合
milvus.drop_collection(collection_name='test01')
- 1
- 创建分区
milvus.create_partition('test01', 'tag01')
- 1
- 2
- 删除分区
milvus.drop_partition(collection_name='test01', partition_tag='tag01')
- 1
- 2
- 在集合中插入向量
import random
vectors = [[() for _ in range(256)] for _ in range(20)]
(collection_name='test01', records=vectors)
自定义id
vector_ids = [id for id in range(20)]
(collection_name='test01', records=vectors, ids=vector_ids)
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 9
- 10
- 在分区中插入向量
('test01', vectors, partition_tag="tag01")
- 1
- 2
- 通过id删除
ids = [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12, 13, 14, 15, 16, 17, 18, 19]
milvus.delete_entity_by_id(collection_name='test01', id_array=ids)
- 1
- 2
- 3
- 4
- 5
- 创建索引
ivf_param = {'nlist': 16384}
milvus.create_index('test01', IndexType.IVF_FLAT, ivf_param)
- 1
- 2
- 删除索引
milvus.drop_index('test01')
- 1
- 2
- 查询向量
search_param = {'nprobe': 16}
q_records = [[() for _ in range(256)] for _ in range(5)]
(collection_name='test01', query_records=q_records, top_k=2, params=search_param)
top_k 指的是向量空间中距离目标向量最近的 k 个向量
top_k 的范围为:[1, 16384]。
- 1
- 2
- 3
- 4
- 5
- 6
- 7
- 8
- 分区中查询向量
q_records = [[() for _ in range(256)] for _ in range(5)]
(collection_name='test01', query_records=q_records, top_k=1, partition_tags=['tag01'], params=search_param)
- 1
- 2
- 3
- 数据落盘 对数据进行修改后 落时间1s
(collection_name_array=['test01'])
- 1
- 2
- 数据段整理
一个集合可包含多个数据段。如果一个数据段中的向量数据被删除,其所占据的空间并不会自动释放。
(collection_name='test01', timeout=1)
- 1
- 2
- 3