基本概念与使用
本文基于Python sdk使用
连接服务器
milvus = Milvus(host='localhost', port='19530')
集合
存储向量与索引的基本单元,类似于关系型数据库的表的概念,创建集合需设置集合名称collection_name,维度dimension,索引数据文件大小index_file_size,距离度量方式metric_type。
创建集合:
param = {'collection_name':'test01', 'dimension':256, 'index_file_size':1024, 'metric_type':MetricType.L2}
milvus.create_collection(param)
删除集合:
milvus.drop_collection(collection_name='test01')
分区
通过标签将集合分割为若干个分区,从而提高搜索效率。每个分区实际上也是一个集合。
创建分区:
milvus.create_partition('test01', 'tag01')
删除分区:
milvus.drop_partition(collection_name='test01', partition_tag='tag01')
向量
每个集合中存储的主要数据,单次插入最大256MB向量数据。
插入向量:
vectors = [[() for _ in range(256)] for _ in range(20)]
(collection_name='test01', records=vectors)
自定义ID向量:
(collection_name='test01', records=vectors)
(collection_name='test01', records=vectors, ids=vector_ids)
分区中插入向量:
('test01', vectors, partition_tag="tag01")
通过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)
索引
一个集合只支持一种索引类型,切换索引类型会自动删除旧的索引文件。在创建其它索引前,FLAT 作为集合的默认索引类型。
create_index()
会指定该集合的索引类型,并同步为之前插入的数据建立索引,后续插入的数据在大小达到 index_file_size
时,索引会在后台自动建立。在实际生产环境中,如果是流式数据,建议在插入向量之前先创建索引,以便后续系统自动建立;如果是静态数据,建议导入所有数据后再一次性创建索引。
索引文件往往比原始向量更大。
为指定集合创建索引:
ivf_param = {'nlist': 16384}
milvus.create_index('test01', IndexType.IVF_FLAT, ivf_param)
删除索引:
milvus.drop_index('test01')
查询向量
搜索参数:对于不同的索引类型,搜索所需参数也有区别。所有的搜索参数都必须赋值。
搜索:
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)
在分区中搜索:
(collection_name='test01', query_records=q_records, top_k=1, partition_tags=['tag01'], params=search_param)
数据落盘
在进行有关数据更改的操作时,你可以将集合中的数据从内存中进行 flush 操作使数据落盘。Milvus 也会执行自动落盘。自动落盘会在固定的时间周期(1 秒)对所有现存集合的数据进行落盘操作。
(collection_name_array=['test01'])
在调用 delete
接口后,用户可以选择再调用 flush
,保证新增的数据可见,被删除的数据不会再被搜到。
数据段整理
数据段是 Milvus 自动将插入的向量数据合并所获得的数据文件。一个集合可包含多个数据段。如果一个数据段中的向量数据被删除,其所占据的空间并不会自动释放。你可以对集合中的数据段进行 compact 操作以释放多余空间。
(collection_name='test01', timeout=1)
关闭客户端
()
距离度量方式
欧氏距离(L2)、内积 (IP)、杰卡德距离、谷本距离、超结构、子结构。
优化
配置优化:
cache:
cache_size,内存中的缓冲区大小
insert_buffer_size,数据导入时的缓冲区大小
gpu:
cache_size,显存中的缓冲区大小,当前阶段建议4G起步,否则将面临显存-内存数据切换问题
gpu_search_threshold,gpu检索的阈值,np最小值
Wal:
buffer_size,预写式日志缓冲区大小,0-4096mb,当前参考512mb
SDK使用:
建立索引时:nlist,索引分桶数量,一般情况下nlist越大,检索性能越好,也可在按照4 * sqrt(n)方式设置再做优化。
检索:nprobe,检索时需要检索到的桶数,值越大检索性能越低,但精准度下降。科通通过实验设置合理的值。
索引类型选择:
Milvus支持八种索引类型,当前可参考FLAT、IVF_FLAT、IVF_SQ8H三种。
FLAT | N/A |
|
IVF_FLAT | 基于量化的索引 |
|
IVF_SQ8H | 基于量化的索引 |
|
分布式集群
略显复杂,暂无可额外总结的知识点,参考官方文档
Mishards:集群分片中间件 - Milvus documentation