Milvus 基本操作
您也可以使用其它客户端,例如 Java, , Go, 或 .
导入 pymilvus。
使用以下任意一种方法连接 Milvus 服务端:
>>> milvus = Milvus(host='localhost', port='19530')
注意:在上面的代码中,
host
和port
都使用了默认值。您可以将其更改为自己设定的 IP 地址和端口。>>> milvus = Milvus(uri='tcp://localhost:19530')
创建/删除 collection
创建 collection
准备创建 collection 所需参数。
# Prepare collection parameters
>>> param = {'collection_name':'test01', 'dimension':256, 'index_file_size':1024, 'metric_type':MetricType.L2}
创建 collection 名为
test01
, 维度为 256, 自动创建索引的数据文件大小为 1024 MB,距离度量方式为欧氏距离(L2)的 collection 。# Create a collection
>>> milvus.create_collection(param)
获取 collection 的统计信息
您可以调用如下接口查询 collection 的统计信息。查询结果的信息包含 collection /分区/ segment 的向量数量,存储使用量等信息。
>>> milvus.get_collection_stats('test01')
删除 collection
# Drop collection
>>> milvus.drop_collection(collection_name='test01')
在 collection 中创建/删除分区
创建分区
# Create partition
>>> milvus.create_partition('test01', 'tag01')
删除分区
创建索引
目前,一个集合只支持一种索引类型,切换索引类型会自动删除旧的索引文件。在创建其它索引前,FLAT作为集合的默认索引类型。
注意:
create_index()
会指定该集合的索引类型,并同步为之前插入的数据建立索引,后续插入的数据在大小达到index_file_size
时,索引会在后台自动建立。在实际生产环境中,如果是流式数据,建议在插入向量之前先创建索引,以便后续系统自动建立;如果是静态数据,建议所有数据导入后再一次性创建。更多索引用法请参考 索引示例程序。
准备创建索引所需参数(以
IVF_FLAT
为例)。索引参数是一个 JSON 字符串,在 Python SDK 中以字典来表示。# Prepare index param
>>> ivf_param = {'nlist': 16384}
关于详细信息请参考 。
2. 为 collection 创建索引。
# Create index
>>> milvus.create_index('test01', IndexType.IVF_FLAT, ivf_param)
删除索引
删除索引后,集合再次使用默认索引类型FLAT。
在 collection /分区中插入/删除向量
在 collection 中插入向量
使用
random
函数生成 20 个 256 维的向量。>>> import random
# Generate 20 vectors of 256 dimension
>>> vectors = [[random.random() for _ in range(dim)] for _ in range(20)]
插入向量列表。如果您不指定向量 ID,Milvus 自动为向量分配 ID。
# Insert vectors
>>> milvus.insert(collection_name='test01', records=vectors)
>>> vector_ids = [id for id in range(20)]
>>> milvus.insert(collection_name='test01', records=vectors, ids=vector_ids)
在分区中插入向量
>>> milvus.insert('test01', vectors, partition_tag="tag01")
通过 ID 删除向量
假设您的 collection 中存在以下向量 ID:
您可以通过以下命令删除向量:
通过 ID 获取向量
您也可以根据向量 ID 获取向量:
>>> status, vector = milvus.get_entity_by_id(collection_name='test01', ids=ids[:10])
将 collection 中的数据进行 flush 操作
当您在进行有关数据更改的操作时,您可以将 collection 中的数据从内存中进行 flush 操作使数据落盘。Milvus 也会执行自动 flush。自动 flush 会在固定的时间周期(1 秒)将所有现存 collection 的数据进行 flush 操作。
>>> milvus.flush(collection_name_array=['test01'])
Segment 是 Milvus 自动将插入的向量数据合并所获得的数据文件。一个 collection 可包含多个 segment 。如果一个 segment 中的向量数据被删除,被删除的向量数据占据的空间并不会自动释放。您可以对 collection 中的 segment 进行 compact 操作以释放多余空间。
>>> milvus.compact(collection_name='test01', timeout='1')
获取 segment 中的向量 ID
您可以获取指定 segment 中向量 ID 信息。您需要提供 segment 的名称。 segment 的名称可以从 get_collection_stats
中获取。
>>> milvus.list_id_in_segment('test01', '1583727470444700000')
在 collection /分区中搜索向量
在 collection 中搜索向量
创建搜索参数。搜索参数是一个 JSON 字符串,在 Python SDK 中以字典来表示。
>>> search_param = {'nprobe': 16}
注意:对于不同的索引类型,搜索所需参数也有区别。所有的搜索参数都必须赋值。
索引类型 | 搜索参数 | 示例参数 | 取值范围 |
---|---|---|---|
FLAT |
- | - | |
IVFLAT /SQ8 /SQ8H /IVFPQ |
nprobe :查询时所涉及的向量类的个数。nprobe 影响查询精度。数值越大,精度越高,速度越慢。 |
{nprobe: 32} |
[1, nlist ] |
NSG |
search_length :值越大,代表在图中搜索的节点越多,召回率越高,速度越慢。 |
{search_length:100} |
[10, 300] |
HNSW |
ef :值越大,则在索引中搜索的数据越多,召回率越高,速度越慢。 |
{ef: 64} |
[topk , 4096] |
ANNOY |
search_k : 影响搜索性能。值越大,搜索结果越精确,但搜索时间越长。-1表示默认值,取总数据量的5%。 |
{"search_k": -1} |
{-1} ∪ [topk, ∞) |
# create 5 vectors of 32-dimension
>>> q_records = [[random.random() for _ in range(dim)] for _ in range(5)]
>>> milvus.search(collection_name='test01', query_records=q_records, top_k=2, params=search_param)
在分区中搜索向量
注意:如果您不指定
partition_tags
, Milvus 会在整个 collection 中搜索。
接下来您可以
- 体验 Milvus 在线训练营 了解更多解决方案