开源向量数据库--milvus

时间:2024-11-16 07:08:50

Milvus 是一款开源的向量相似度搜索引擎,支持针对 TB 级向量的增删改操作和近实时查询,具有高度灵活、稳定可靠以及高速查询等特点。Milvus 集成了 Faiss、NMSLIB、Annoy 等广泛应用的向量索引库,提供了一整套简单直观的 API,让你可以针对不同场景选择不同的索引类型。此外,Milvus 还可以对标量数据进行过滤,进一步提高了召回率,增强了搜索的灵活性。

特性

  • 异构计算
  1. 优化了基于 GPU 搜索向量和建立索引的性能
  2. 可以在单台通用服务器上完成对 TB 级数据的毫秒级搜索
  3. 动态数据管理
  • 支持主流索引库、距离计算方式和监控工具
  1. 集成了 Faiss、NMSLIB、Annoy 等向量索引库
  2. 支持基于量化的索引、基于图的索引和基于树的索引
  3. 相似度计算方式包括欧氏距离 (L2)、内积 (IP)、汉明距离、杰卡德距离等
  4. Prometheus 作为监控和性能指标存储方案,Grafana 作为可视化组件进行数据展示
  • 近实时搜索
  1. 插入 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