milvus官方文档
milvus2.3.1的官方文档地址: https://milvus.io/docs/v2.3.x
使用attu创建collection
collection必须要有一个主键字段、向量字段
确保字段类型与索引类型兼容
字符串类型(VARCHAR)通常需要使用 Trie
索引,而不是 AutoIndex
使用代码连接milvus数据库,创建collection结构,并插入数据
import uuid
import numpy as np
from pymilvus import(
connections,
FieldSchema, CollectionSchema, DataType,
Collection,
)
collection_name = "first_milvus"
host = "192.168.171.130"
port = 19530
username = ""
password = ""
num_entities, dim = 1000, 128
total_num = 3000
def generate_uuids(number_of_uuids):
# uuid.uuid4() 产生随机数
# str(uuid.uuid4()) 将随机数转成str
# _ in range(number_of_uuids) 产生多少个_(占位符),存放随机数,组成一个list
uuids = [str(uuid.uuid4()) for _ in range(number_of_uuids)]
return uuids
print("start connecting to milvus")
connections.connect("default", host=host, port=port, user=username, password=password)
fields = [
FieldSchema(name="pk", dtype=DataType.INT64, is_primary=True, auto_id=False),
FieldSchema(name="random", dtype=DataType.DOUBLE),
FieldSchema(name="comment", dtype=DataType.VARCHAR, max_length=200),
FieldSchema(name="embeddings", dtype=DataType.FLOAT_VECTOR, dim=dim)
]
schema = CollectionSchema(fields, "first_milvus is the simplest demo to introduce the APIS")
coll = Collection(collection_name, schema, consistency_level="Bounded", shards_num=1)
# seed=19530 设置了随机数生成器的种子,确保每次运行代码时生成的随机数序列是相同的(可重复性)。
rng = np.random.default_rng(seed=19530)
# entities = [
# [0, 1, 2], # 实体 ID
# [0.123, 0.456, 0.789], # 随机属性
# ['uuid1', 'uuid2', 'uuid3'], # UUID
# [[0.123, 0.456], [0.789, 0.012], [0.345, 0.678]], # 特征向量
# ]
entities = [
# 生成一个从 0 到 num_entities - 1 的整数列表
[i for i in range(num_entities)],
# 随机数生成器 rng 生成 num_entities 个随机浮点数,范围在 [0, 1) 之间
# tolist() 将 NumPy 数组转换为 Python 列表
# 如果 num_entities = 3,可能生成 [0.123, 0.456, 0.789]
rng.random(num_entities).tolist(),
# 生成一个包含 num_entities 个 UUID 字符串的列表, 列表可能用于为每个实体分配一个全局唯一的标识符
generate_uuids(num_entities),
# 使用随机数生成器 rng 生成一个形状为 (num_entities, dim) 的二维 NumPy 数组
# num_entities表示二维数组中有几个数组,dim表示第二层数组里面有几个元素
rng.random((num_entities, dim)),
]
insert_result = coll.insert(entities)
coll.flush()
print("done")
向量字段上创建索引
在向量字段上创建索引才能load进内存。
如果数据量大的情况,创建索引的过程需要花费一定的时间。
索引加载到内存
将索引加载到内存中
预览查看数据
collection加载到内存之后,就可以预览和查看数据了。
向量搜索
向量字段就一个,可以自动判断是哪一个字段为向量字段
随机搜索:随机生成一个向量字段的值进行查询。
精确搜索:到预览数据界面找出一条数据,拷贝向量字段的值进行查询。
可以看出pk为3的记录匹配度最高。
score=0表示完全匹配的数据。
总结:milvus中所有的搜索和查询都在内存中执行,所以只有加载的Collection才可以被搜索,要加载到内存需要给向量字段创建索引。