提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档
文章目录
- 操作Milvus数据库
- collections和数据操作
-
- [一、Schema 和字段](#一、Schema 和字段)
- 二、创建Collection
- 三、插入数据
操作Milvus数据库

数据库操作

a、连接数据库
bash
from pymilvus import MilvusClient
client = MilvusClient(
uri="http://39.100.64.14:19530",
token="root:Milvus",
)
client = MilvusClient(
uri="http://39.100.64.14:19530",
user="root",
password="Milvus",
# db_name="default",
)
print(client.list_databases())
print(client.list_users())
b、用户管理
bash
# 创建新用户
client.create_user(
user_name="user_zs",
password="P@ssw0rd",
)
print(client.describe_user("user_zs"))
# 更新用户密码
client.update_password(
user_name="user_zs",
old_password="P@ssw0rd",
new_password="P@ssw0rd123"
)
# 删除用户
client.drop_user(user_name="user_zs")
c、数据库管理

bash
# 创建数据库
client.create_database(
db_name="my_database",
properties={
"database.max.collections": 10
}
)
print(client.list_databases())
# 查看数据库信息
print(client.describe_database(
db_name="my_database"
))
# 使用数据库(切换数据库)
client.use_database(
db_name="my_database"
)
# 删除数据库
client.drop_database(
db_name="my_database"
)
print(client.list_databases())
1、DDL操作
1.1 Database


1.2 Collection



2、DML操作
确保已删除名为docs 的collection,下文会重新创建
2.1 准备嵌入模型



2.2 准备collection

python
{
'collection_name': 'docs',
'auto_id': False,
'num_shards': 1,
'description': '',
'fields': [
{
'field_id': 100,
'name': 'id',
'description': '',
'type': <DataType.INT64: 5>,
'params': {},
'is_primary': True
},
{
'field_id': 101,
'name': 'vector',
'description': '',
'type': <DataType.FLOAT_VECTOR: 101>,
'params': {'dim': 1024}
}
],
'functions': [],
'aliases': [],
'collection_id': 467040847074183555,
'consistency_level': 2,
'properties': {'timezone': 'UTC'},
'num_partitions': 1,
'enable_dynamic_field': True,
'enable_namespace': False,
'created_timestamp': 467041742317420562,
'update_timestamp': 467041742317420562
}

2.3 准备数据



2.4 写入数据


3、DQL操作
3.1 扫描数据
通过query_iterator 扫描collection下的所有数据
python
iterator = client.query_iterator(
collection_name=collection_name,
filter="",
output_fields=["*"]
)
i = 0
while True:
rows = iterator.next()
if not rows:
break
for row in rows:
print(f"第{i + 1}条数据:")
# print(row)
print(f"id : {row["id"]},vector = {row["vector"][:5]},text = {row["text"]},source = {row["source"]}")
i += 1
iterator.close()
python
第1条数据:
id : 0,vector = [-0.011260323226451874, 0.04925568029284477, 0.04267069697380066, -0.0021236573811620474, 0.005432611797004938],text = LangChain 是一个用于构建 LLM 应用的开发框架。,source = demo
第2条数据:
id : 1,vector = [-0.02432798594236374, 0.0016291062347590923, 0.01846320368349552, 0.00872476864606142, -0.009267804212868214],text = Milvus 是一个适合 AI 应用的向量数据库。,source = demo
第3条数据:
id : 2,vector = [-0.004508086945861578, 0.030777014791965485, 0.0059316931292414665, -0.03660701960325241, -0.0033217482268810272],text = RAG 的核心是先检索相关知识,再让大模型生成答案。,source = demo
第4条数据:
id : 3,vector = [0.005521129816770554, 0.013496095314621925, -0.013929124921560287, -0.02554875798523426, -0.010753572918474674],text = Docker Desktop 可以方便地在本地运行 Milvus Standalone。,source = demo
3.2 通过主键查询数据
python
res = client.get(
collection_name=collection_name,
ids=[0,1,2]
)
print(len(res))
for i in range(len(res)):
print(f"第{i + 1}条数据:")
print(f"id : {res[i]["id"]},vector = {res[i]["vector"][:5]},text = {res[i]["text"]},source = {res[i]["source"]}")
# print(res[i])
python
3
第1条数据:
id : 0,vector = [-0.011260323226451874, 0.04925568029284477, 0.04267069697380066, -0.0021236573811620474, 0.005432611797004938],text = LangChain 是一个用于构建 LLM 应用的开发框架。,source = demo
第2条数据:
id : 1,vector = [-0.02432798594236374, 0.0016291062347590923, 0.01846320368349552, 0.00872476864606142, -0.009267804212868214],text = Milvus 是一个适合 AI 应用的向量数据库。,source = demo
第3条数据:
id : 2,vector = [-0.004508086945861578, 0.030777014791965485, 0.0059316931292414665, -0.03660701960325241, -0.0033217482268810272],text = RAG 的核心是先检索相关知识,再让大模型生成答案。,source = demo
3.3 相似度检索
① 准备查询嵌入
python
#%%
# 相似度检索
query = "什么是向量数据库?"
query_vector = embed_model.embed_query(query)
② 检索
python
results = client.search(
collection_name=collection_name,
data=[query_vector],
limit=3,
output_fields=["text","source","id"]
)
for res in results[0]:
print(res)
python
{'id': 0, 'distance': 0.6388449668884277, 'entity': {'id': 0, 'text': 'LangChain 是一个用于构建 LLM 应用的开发框架。', 'source': 'demo'}}
{'id': 3, 'distance': 0.31398770213127136, 'entity': {'id': 3, 'text': 'Docker Desktop 可以方便地在本地运行 Milvus Standalone。', 'source': 'demo'}}
{'id': 2, 'distance': 0.2985413074493408, 'entity': {'id': 2, 'text': 'RAG 的核心是先检索相关知识,再让大模型生成答案。', 'source': 'demo'}}

collections和数据操作

一、Schema 和字段


python
from pymilvus import MilvusClient, DataType
schema = MilvusClient.create_schema()
a、主键和 AutoId

python
schema.add_field(
field_name="my_id",
datatype=DataType.INT64,
is_primary=True,
auto_id=False,
)
schema.add_field(
field_name="my_id",
datatype=DataType.VARCHAR,
is_primary=True,
auto_id=True,
max_length=512,
)

b、向量字段
-
向量字段接受各种稀疏和密集向量嵌入。,您可以向 Collections 添加最多四个向量字段。
-
密集向量主要用于需要理解数据语义的场景,如语义搜索和推荐系统。在语义搜索中,密集向量有助于捕捉查询和文档之间的潜在联系,提高搜索结果的相关性。在推荐系统中,密集矢量有助于识别用户和项目之间的相似性,从而提供更加个性化的建议。
-
稠密向量可使用各种嵌入模型生成,这些模型将原始数据转化为高维空间中的点,捕捉数据的语义特征。
-
密集向量通常表示为具有固定长度的浮点数数组,如0.2, 0.7, 0.1, 0.8, 0.3, ..., 0.5 。这些向量的维度通常从数百到数千不等,如 128、256、768 或 1024。每个维度都能捕捉对象的特定语义特征,通过相似性计算使其适用于各种场景。


python
schema.add_field(field_name="dense_vector", datatype=DataType.FLOAT_VECTOR, dim=1024)

为向量字段设置索引参数
为了加速语义搜索,必须为向量字段创建索引。索引可以大大提高大规模向量数据的检索效率。
python
index_params = client.prepare_index_params()
index_params.add_index(
field_name="dense_vector",
index_name="dense_vector_index",
index_type="AUTOINDEX",
metric_type="IP"
)
client.create_collection(
collection_name="my_collection",
schema=schema,
index_params=index_params
)




c、稀疏向量

python
schema.add_field(field_name="sparse_vector", datatype=DataType.SPARSE_FLOAT_VECTOR)
schema.add_field(field_name="text", datatype=DataType.VARCHAR, max_length=65535,

python
index_params = client.prepare_index_params()
index_params.add_index(
field_name="sparse_vector",
index_name="sparse_inverted_index",
index_type="SPARSE_INVERTED_INDEX",
metric_type="BM25",
params={"inverted_index_algo": "DAAT_MAXSCORE"}, # or "DAAT_WAND" or "TAAT_NAIVE"
)


d、全文索引和搜索



python
analyzer_params = {
"tokenizer": "jieba",
"filter": ["cnalphanumonly"]
}
analyzer_params = {
"type": "chinese",
}

python
analyzer_params = {
"tokenizer": "standard",
"filter": [
"lowercase",
{
"type": "stemmer",
"language": "english"
}, {
"type": "stop",
"stop_words": "_english_"
}
]
}
现在,定义一个将文本转换为稀疏向量表示的函数,然后将其添加到 Schema 中:
python
bm25_function = Function(
name="text_bm25_emb", # Function name
input_field_names=["text"], # Name of the VARCHAR field containing raw text data
output_field_names=["sparse"],
# Name of the SPARSE_FLOAT_VECTOR field reserved to store generated embeddings
function_type=FunctionType.BM25, # Set to `BM25`
)
schema.add_function(bm25_function)

e、标量字段

python
schema.add_field(
field_name="my_array",
datatype=DataType.ARRAY,
element_type=DataType.VARCHAR,
max_capacity=5,
max_length=512,
)
schema.add_field(
field_name="my_json",
datatype=DataType.JSON,
)
schema.add_field(
field_name="my_bool",
datatype=DataType.BOOL,
)
schema.add_field(
field_name="my_int64",
datatype=DataType.INT64, # Milvus 支持的数字类型有Int8,Int16,Int32,Int64,Float 和Double 。
)
schema.add_field(
field_name="my_varchar",
datatype=DataType.VARCHAR,
# highlight-next-line
max_length=512
)
f、可归零和默认值

python
schema.add_field(field_name="age", datatype=DataType.INT64, nullable=True)
schema.add_field(field_name="age", datatype=DataType.INT64, default_value=18)

二、创建Collection
python
from pymilvus import MilvusClient, DataType, Function, FunctionType
client = MilvusClient(
uri="http://39.100.64.14:19530",
user="root",
password="Milvus",
# db_name="default",
)
schema = client.create_schema()
schema.add_field(field_name='id', datatype=DataType.INT64, is_primary=True, auto_id=True)
schema.add_field(field_name='text', datatype=DataType.VARCHAR, max_length=6000, enable_analyzer=True,
analyzer_params={"tokenizer": "jieba", "filter": ["cnalphanumonly"]})
schema.add_field(field_name='category', datatype=DataType.VARCHAR, max_length=1000, nullable=True)
schema.add_field(field_name='filename', datatype=DataType.VARCHAR, max_length=1000, nullable=True)
schema.add_field(field_name='filetype', datatype=DataType.VARCHAR, max_length=1000, nullable=True)
schema.add_field(field_name='title', datatype=DataType.VARCHAR, max_length=1000, nullable=True)
schema.add_field(field_name='sparse', datatype=DataType.SPARSE_FLOAT_VECTOR)
schema.add_field(field_name='dense', datatype=DataType.FLOAT_VECTOR, dim=1024)
bm25_function = Function(
name="text_bm25_emb", # Function name
input_field_names=["text"], # Name of the VARCHAR field containing raw text data
output_field_names=["sparse"],
function_type=FunctionType.BM25, # Set to `BM25`
)
schema.add_function(bm25_function)
index_params = client.prepare_index_params()
index_params.add_index(
field_name="sparse",
index_name="sparse_inverted_index",
index_type="SPARSE_INVERTED_INDEX", # Inverted index type for sparse vectors
metric_type="BM25",
params={
"inverted_index_algo": "DAAT_MAXSCORE",
"bm25_k1": 1.2, # 1.2 ~ 2.0 (1.2) 词频 (TF) 的饱和度: 高频词的贡献越大,词频影响越线性,饱和度增长越慢(通俗:控制一个词出现多少次才算"多")
"bm25_b": 0.75 # 0.0 ~ 1.0 (0.75) 文档长度归一化的强度: 文档长度的影响越大,对长文档的惩罚越强(通俗:控制"长篇大论"相对于"言简意赅"的劣势有多大,旨在避免长文档仅仅因为包含更多词汇而在相似度计算中占据不公平的优势。)
},
)
index_params.add_index(
field_name="dense",
index_name="dense_inverted_index",
index_type="AUTOINDEX",
metric_type="IP"
)
client.create_collection(
collection_name='t_doc_collection',
schema=schema,
index_params=index_params
)
# 查看集合信息
res = client.describe_collection(
collection_name="t_doc_collection"
)
print(res)
python
# 加载 Collections 时,Milvus 会将索引文件和所有字段的原始数据加载到内存中,以便快速响应搜索和查询。
# 在载入 Collections 后插入的实体会自动编入索引并载入。
client.load_collection(
collection_name="t_doc_collection"
)
res = client.get_load_state(
collection_name="t_doc_collection"
)
print(res)
# 释放当前不使用的 Collection。
client.release_collection(
collection_name="t_doc_collection"
)
res = client.get_load_state(
collection_name="t_doc_collection"
)
print(res)
# 删除集合
# client.drop_collection(
# collection_name="t_doc_collection"
# )
三、插入数据
python
client = MilvusClient(
uri="http://39.100.64.14:19530",
user="root",
password="Milvus",
# db_name="default",
)
# 准备三条示例数据
sample_data = [
{
"text": "机器学习是人工智能的一个子领域,它使计算机系统能够从数据中学习并改进,而无需明确编程。常见的应用包括图像识别、自然语言处理和推荐系统。",
"category": "人工智能",
"filename": "ml_intro.pdf",
"filetype": "PDF",
"title": "机器学习基础"
},
{
"text": "Python是一种高级、解释型的通用编程语言。其设计哲学强调代码的可读性,语法允许程序员用更少的代码行表达概念。Python支持多种编程范式,包括结构化、面向对象和函数式编程。",
"category": "编程语言",
"filename": "python_guide.docx",
"filetype": "Word",
"title": "Python 语言特性"
},
{
"text": "区块链是一种分布式数据库,用于维护持续增长的记录列表,称为块。这些块使用加密技术链接和保护。区块链技术是比特币等加密货币的基础,但也在供应链管理、数字身份等领域有应用。",
"category": "信息技术",
"filename": "blockchain_overview.txt",
"filetype": "Text",
"title": "区块链技术简介"
}
]
qwen3_embedding = SentenceTransformer("Qwen/Qwen3-Embedding-0.6B")
# resp = qwen3_embedding.encode('I like large language models.')
# print(resp)
# 为每条数据的 text 字段生成 dense 向量
for data in sample_data:
data["dense"] = qwen3_embedding.encode(data["text"])
print(sample_data)
# 插入数据
insert_result = client.insert(
collection_name="t_doc_collection",
data=sample_data
)
print(f"成功插入 {insert_result['insert_count']} 条数据。")
print(f"生成的主键 IDs: {insert_result['ids']}")