Milvus实践 第二章:基本概念使用与优化

基本概念与使用

本文基于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 = [[random.random() for _ in range(256)] for _ in range(20)]

milvus.insert(collection_name='test01', records=vectors)

自定义ID向量:

milvus.insert(collection_name='test01', records=vectors)

milvus.insert(collection_name='test01', records=vectors, ids=vector_ids)

分区中插入向量:

milvus.insert('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 = [[random.random() for _ in range(256)] for _ in range(5)]

milvus.search(collection_name='test01', query_records=q_records, top_k=2, params=search_param)

在分区中搜索:

milvus.search(collection_name='test01', query_records=q_records, top_k=1, partition_tags=['tag01'], params=search_param)

数据落盘

在进行有关数据更改的操作时,你可以将集合中的数据从内存中进行 flush 操作使数据落盘。Milvus 也会执行自动落盘。自动落盘会在固定的时间周期(1 秒)对所有现存集合的数据进行落盘操作。

milvus.flush(collection_name_array=['test01'])

在调用 delete 接口后,用户可以选择再调用 flush,保证新增的数据可见,被删除的数据不会再被搜到。

数据段整理

数据段是 Milvus 自动将插入的向量数据合并所获得的数据文件。一个集合可包含多个数据段。如果一个数据段中的向量数据被删除,其所占据的空间并不会自动释放。你可以对集合中的数据段进行 compact 操作以释放多余空间。

milvus.compact(collection_name='test01', timeout=1)

关闭客户端

milvus.close()

距离度量方式

欧氏距离(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支持八种索引类型,当前可参考FLATIVF_FLAT、IVF_SQ8H三种。

FLATN/A
      • 查询数据规模小,对查询速度要求不高。
      • 需要 100% 的召回率。
      • rt 6ms
IVF_FLAT基于量化的索引
      • 高速查询,
      • 要求尽可能高的召回率。
      • rt 5ms
IVF_SQ8H基于量化的索引
      • 高速查询,
      • 磁盘、内存、显存有限。
      • rt 3ms

分布式集群

略显复杂,暂无可额外总结的知识点,参考官方文档

Mishards:集群分片中间件 - Milvus documentation

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
作为一个人工智能引擎,Milvus可以与Java编程语言集成,为开发者提供高效的数据存储和检索功能。以下是使用Java与Milvus进行集成的步骤: 1. 下载并安装Java SDK和Milvus服务器。 2. 在Java项目中添加Milvus的依赖项。 3. 连接到Milvus服务器。 ```java import io.milvus.client.*; MilvusClient client = new MilvusGrpcClient("localhost", 19530); ``` 4. 创建集合。 ```java String collectionName = "my_collection"; int dimension = 128; CollectionMapping collectionMapping = CollectionMapping.newBuilder() .setCollectionName(collectionName) .setDimension(dimension) .setIndexFileSize(1024) .setMetricType(MetricType.L2) .build(); client.createCollection(collectionMapping); ``` 5. 插入向量数据。 ```java List<FloatVector> vectors = new ArrayList<>(); vectors.add(FloatVector.newBuilder().addValue(1.0f).addValue(2.0f).build()); vectors.add(FloatVector.newBuilder().addValue(2.0f).addValue(3.0f).build()); List<Long> ids = client.insert(collectionName, vectors); ``` 6. 进行向量检索。 ```java SearchParam searchParam = SearchParam.newBuilder() .setCollectionName(collectionName) .setQueryRecordNum(10) .setQueryRangeArray( Range.newBuilder() .setStartValue(0.0) .setEndValue(1.0) .build() ).build(); SearchResponse searchResponse = client.search(searchParam); ``` 7. 删除数据和集合。 ```java client.deleteByIds(collectionName, ids); client.dropCollection(collectionName); ``` 以上是使用Java与Milvus进行集成的基本步骤。开发者可以根据自己的需求进行定制化开发,以实现更高效的数据存储和检索。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值