Milvus实操
概念
Milvus 关键概念优化笔记
Milvus 是一个高性能、可扩展的开源向量数据库,专为处理海量向量数据和执行相似性搜索而设计。以下是 Milvus 中的一些核心概念及其详细解释。
1. 集合(Collection)
定义: 集合是 Milvus 中存储向量数据的基本单位,类似于关系数据库中的表。每个集合包含多个向量,每个向量可以有多个属性(字段)。
特点:
- 结构化存储:集合定义了向量的维度和相关的元数据字段。
- 模式定义:在创建集合时,可以定义字段的名称、类型和参数。
示例:
from pymilvus import Collection, FieldSchema, DataType
# 定义字段
fields = [
FieldSchema(name="product_id", dtype=DataType.INT64, is_primary=True, auto_id=False),
FieldSchema(name="description", dtype=DataType.VARCHAR, params={"max_length": 65535}),
FieldSchema(name="vector", dtype=DataType.FLOAT_VECTOR, params={"dim": 128}),
]
# 创建集合
collection = Collection(name="product_vectors", fields=fields)
说明:
- 主键字段:
product_id
是主键,唯一标识每个实体。 - 向量字段:
vector
存储高维向量,用于相似性搜索。 - 元数据字段:
description
存储与向量相关的文本描述。
2. 向量索引(Index)
定义: 索引用于加速向量的相似性搜索。Milvus 提供多种索引类型,每种索引在不同的数据规模和查询场景下具有不同的性能表现。
常见索引类型:
- IVF_FLAT:基于倒排文件的扁平索引,适用于高精度搜索。
- IVF_SQ8:基于倒排文件的量化索引,平衡精度与性能。
- HNSW:基于层次化导航小世界图的索引,适用于快速近似搜索。
- ANNOY:基于随机投影树的索引,适用于大规模数据集。
示例:
# 定义索引参数
index_params = {
"index_type": "IVF_FLAT",
"metric_type": "L2",
"params": {"nlist": 100},
}
# 创建索引
collection.create_index(field_name="vector", index_params=index_params)
说明:
index_type
:指定索引的类型,如IVF_FLAT
。metric_type
:指定距离度量方式,如L2
(欧氏距离)或COSINE
(余弦相似度)。params
:索引相关的参数,如nlist
控制倒排文件的数量。
3. 分区(Partition)
定义: 分区是集合内数据的逻辑划分,用于提高数据管理和查询效率。每个分区包含一部分向量数据,可以基于特定的条件进行划分。
特点:
- 逻辑隔离:不同分区的数据在逻辑上隔离,但在物理存储上仍在同一集合中。
- 提高查询效率:通过限定查询范围,可以减少搜索空间,提升查询性能。
示例:
# 创建分区
partition = collection.partition(name="electronics", expr="category == 'electronics'")
说明:
- 分区名称:
electronics
是分区的名称。 - 分区表达式:
expr="category == 'electronics'"
定义了分区的数据范围。
4. 副本(Replica)
定义: 副本是分区的冗余拷贝,用于提升数据的可用性和查询性能。每个分区可以有多个副本,确保在节点故障时数据不会丢失。
特点:
- 高可用性:通过副本机制,确保数据在节点故障时仍然可用。
- 负载均衡:多个副本可以分担查询负载,提升整体查询性能。
说明:
- 副本数量:副本数量通常在部署阶段配置,具体取决于集群规模和容错需求。
5. 实体(Entity)与属性(Attribute)
实体(Entity): 集合中的一条记录,包含一个或多个属性。
属性(Attribute): 实体中的具体字段,如标识符、描述、向量等。
示例:
# 定义实体数据
entities = [
[101, "Product A description", vector_a],
[102, "Product B description", vector_b],
[103, "Product C description", vector_c],
]
# 插入实体
collection.insert(entities)
说明:
- 主键:每个实体通过
product_id
唯一标识。 - 描述:
description
字段存储产品的文本描述。 - 向量:
vector
字段存储产品的高维向量表示,用于相似性搜索。
6. 向量数据与标量数据
向量数据(Vector Data): 高维浮点数数组,用于表示实体的特征,适用于相似性搜索。
标量数据(Scalar Data): 非向量数据,如整数、字符串等,用于存储实体的属性信息。
说明:
- 向量数据用于执行相似性搜索。
- 标量数据用于过滤和描述实体。
7. CRUD 操作
CRUD(创建、读取、更新、删除)是数据库管理的基本操作。
7.1 创建(Create)
创建集合和分区:
# 创建集合
collection.create_collection(
collection_name="product_vectors",
dimension=128
)
# 创建分区
partition = collection.partition(name="electronics", expr="category == 'electronics'")
7.2 读取(Read)
查询和搜索数据:
# 执行向量搜索
query_vectors = [vector_query]
results = collection.search(
data=query_vectors,
anns_field="vector",
param={"metric_type": "L2", "params": {"nprobe": 10}},
limit=10,
expr=None,
output_fields=["description"],
)
说明:
anns_field
:指定用于搜索的向量字段。param
:搜索参数,如nprobe
控制搜索的广度。limit
:返回的最相似实体数量。expr
:过滤表达式,限定搜索范围。
7.3 更新(Update)
Milvus 不直接支持更新操作。通常的做法是删除旧实体并插入新实体。
# 删除旧实体
collection.delete(expr="product_id == 101")
# 插入新实体
new_entity = [[101, "Updated Product A description", new_vector_a]]
collection.insert(new_entity)
7.4 删除(Delete)
删除实体:
# 按表达式删除实体
collection.delete(expr="category == 'electronics'")
# 按 ID 删除实体
collection.delete(ids=[101, 102])
8. 查询与过滤
查询(Query): 检索符合特定条件的所有实体。
过滤(Filter): 基于标量字段的条件限制搜索范围。
示例:
# 基于过滤条件的向量搜索
results = collection.search(
data=[vector_query],
anns_field="vector",
param={"metric_type": "L2", "params": {"nprobe": 10}},
limit=5,
expr="category == 'electronics'",
output_fields=["description"],
)
说明:
expr
:过滤条件,限定搜索在category
为'electronics'
的实体中进行。
9. 索引构建与管理
构建索引:
index_params = {
"index_type": "IVF_FLAT",
"metric_type": "L2",
"params": {"nlist": 100},
}
collection.create_index(field_name="vector", index_params=index_params)
说明:
index_type
:指定索引类型,如IVF_FLAT
。metric_type
:距离度量方式,如L2
(欧氏距离)。params
:索引相关参数,如nlist
控制倒排文件数量。
管理索引:
# 列出索引
indexes = collection.list_indexes()
# 删除索引
collection.drop_index(field_name="vector")
10. 数据持久化与迁移
数据持久化: Milvus Lite 将所有数据存储在本地文件中,可以通过重新连接到相同的数据库文件来加载现有数据。
示例:
from pymilvus import MilvusClient
# 加载现有数据库
client = MilvusClient("milvus_demo.db")
数据迁移: Milvus Lite 提供命令行工具,可以将数据导出为 JSON 文件,便于迁移到其他 Milvus 部署。
步骤:
-
安装 Bulk Writer:
pip install -U "pymilvus[bulk_writer]"
-
导出数据:
milvus-lite dump -d ./milvus_demo.db -c demo_collection -p ./data_dir
说明:
-d
,--db-file
:Milvus Lite 数据库文件路径。-c
,--collection
:需要导出的集合名称。-p
,--path
:导出文件的存储目录。
11. 使用限制
Milvus Lite 适用于小规模的向量搜索用例,但在某些功能上存在限制。以下是 Milvus Lite 的主要使用限制:
11.1 集合(Collection)
方法 / 参数 | 支持情况 |
---|---|
create_collection() | 支持,参数有限制 |
collection_name | 支持 |
dimension | 支持 |
primary_field_name | 支持 |
id_type | 支持 |
vector_field_name | 支持 |
metric_type | 支持 |
auto_id | 支持 |
schema | 支持 |
index_params | 支持 |
enable_dynamic_field | 支持 |
num_shards | 不支持 |
partition_key_field | 不支持 |
num_partitions | 不支持 |
consistency_level | 仅支持 Strong |
get_collection_stats() | 支持,获取集合统计信息 |
describe_collection() | 部分参数无效(如 num_shards ) |
has_collection() | 支持,检查集合是否存在 |
list_collections() | 支持,列出所有集合 |
drop_collection() | 支持,删除集合 |
rename_collection() | 不支持 |
11.2 字段与模式(Field & Schema)
方法 / 参数 | 支持情况 |
---|---|
create_schema() | 支持,参数有限制 |
auto_id | 支持 |
enable_dynamic_field | 支持 |
primary_field | 支持 |
partition_key_field | 不支持 |
add_field() | 支持,参数有限制 |
field_name | 支持 |
datatype | 支持 |
is_primary | 支持 |
max_length | 支持 |
element_type | 支持 |
max_capacity | 支持 |
dim | 支持 |
is_partition_key | 不支持 |
11.3 插入与搜索(Insert & Search)
方法 / 参数 | 支持情况 |
---|---|
search() | 支持,参数有限制 |
collection_name | 支持 |
data | 支持 |
filter | 支持 |
limit | 支持 |
output_fields | 支持 |
search_params | 支持 |
timeout | 支持 |
partition_names | 不支持 |
anns_field | 支持 |
query() | 支持,参数有限制 |
get() | 支持,参数有限制 |
delete() | 支持,参数有限制 |
insert() | 支持,参数有限制 |
upsert() | 支持,参数有限制 |
11.4 加载与释放(Load & Release)
方法 / 参数 | 支持情况 |
---|---|
load_collection() | 支持 |
release_collection() | 支持 |
get_load_state() | 不支持 |
refresh_load() | 不支持 |
close() | 支持 |
11.5 索引(Index)
方法 / 参数 | 支持情况 |
---|---|
list_indexes() | 支持,列出索引 |
collection_name | 支持 |
field_name | 支持 |
create_index() | 仅支持 FLAT 索引类型 |
index_params | 支持 |
timeout | 支持 |
drop_index() | 支持,删除索引 |
index_name | 支持 |
describe_index() | 支持,描述索引 |
11.6 向量索引类型(Vector Index Types)
Milvus Lite 仅支持 FLAT 索引类型。无论在集合中指定何种索引类型,Milvus Lite 都会使用 FLAT 类型。
11.7 搜索功能(Search Features)
Milvus Lite 支持以下搜索功能:
- 稀疏向量(Sparse Vector)
- 多向量(Multi-vector)
- 混合搜索(Hybrid Search)
11.8 分区与用户管理
- 分区(Partition):Milvus Lite 不支持分区及相关方法。
- 用户与角色(Users & Roles):Milvus Lite 不支持用户和角色管理。
- 别名(Alias):Milvus Lite 不支持别名及相关方法。
12. 补充概念
为了更全面地理解 Milvus,以下是一些补充的重要概念:
12.1 一致性级别(Consistency Level)
定义: 一致性级别定义了数据在分布式环境中的一致性保证。
支持情况:
- Milvus Lite:仅支持 Strong 一致性。
- 服务器部署的 Milvus:支持多种一致性级别,如 Weak、Session 等。
说明:
- Strong:保证数据的强一致性,适用于需要高可靠性的应用场景。
- Weak:允许一定程度的不一致,以提高性能和可用性。
12.2 距离度量(Distance Metric)
定义: 距离度量用于衡量向量之间的相似性。
常见距离度量类型:
- L2(欧氏距离):衡量向量之间的直线距离。
- COSINE(余弦相似度):衡量向量之间的角度相似性。
- IP(内积):衡量向量之间的内积。
说明:
- 选择距离度量:根据应用需求选择合适的距离度量类型,以优化搜索结果的准确性和性能。
12.3 数据类型(Data Types)
向量数据类型:
- FLOAT_VECTOR:存储浮点数向量。
- BINARY_VECTOR:存储二进制向量。
标量数据类型:
- INT64:长整型。
- VARCHAR:可变长度字符串。
- FLOAT:浮点数。
- DOUBLE:双精度浮点数。
示例:
from pymilvus import FieldSchema, DataType
fields = [
FieldSchema(name="id", dtype=DataType.INT64, is_primary=True, auto_id=False),
FieldSchema(name="name", dtype=DataType.VARCHAR, params={"max_length": 255}),
FieldSchema(name="embedding", dtype=DataType.FLOAT_VECTOR, params={"dim": 128}),
]
12.4 CRUD 操作扩展
插入数据(Insert): 插入新的实体数据到集合中。
更新数据(Update): Milvus 不直接支持更新操作,需通过删除旧数据并插入新数据实现。
读取数据(Read): 通过搜索和查询操作检索数据。
删除数据(Delete): 删除符合条件的实体数据。
12.5 数据加载与释放(Load & Release)
加载集合(Load Collection): 将集合数据加载到内存中,以便进行高效的查询和搜索。
collection.load()
释放集合(Release Collection): 释放加载到内存中的集合数据,节省内存资源。
collection.release()
12.6 监控与管理工具
Birdwatcher: 一个用于调试 Milvus 和动态配置更新的开源工具。
Prometheus & Grafana: 用于监控 Milvus 的性能指标和运行状态。
Attu: 一个用于直观管理 Milvus 的开源 GUI 工具。
Milvus Backup: 一个用于 Milvus 数据备份的开源工具,支持数据的备份和恢复。
13. 总结
通过优化后的笔记,您应该能够更清晰地理解 Milvus 的核心概念及其功能。以下是关键要点的总结:
- 集合(Collection):Milvus 中存储向量和元数据的基本单位,类似于关系数据库中的表。
- 索引(Index):用于加速向量相似性搜索,支持多种索引类型。
- 分区(Partition)**与**副本(Replica):用于数据的逻辑划分和高可用性,Milvus Lite 不支持分区和副本。
- 实体(Entity)**与**属性(Attribute):Milvus 中的数据记录及其具体字段。
- 向量数据与标量数据:向量用于相似性搜索,标量用于描述和过滤。
- CRUD 操作:包括创建、读取、更新和删除数据。
- 一致性级别与距离度量:定义数据的一致性保证和向量相似性的衡量方式。
- 数据类型:Milvus 支持多种向量和标量数据类型。
- 数据加载与释放:管理数据在内存中的加载和释放,以优化性能。
- 监控与管理工具:使用工具如 Birdwatcher、Prometheus、Grafana 和 Attu 进行 Milvus 的监控和管理。
Milvus Lite 入门教案
课程结构
- 课程简介
- 安装 Milvus Lite
- 连接到 Milvus Lite
- 创建集合
- 准备和插入数据
- 执行向量搜索
- 使用元数据过滤
- 查询和删除数据
- 数据持久化与迁移
- 实践练习
- 总结与下一步
1. 课程简介
Milvus 是一个高性能、可扩展的向量数据库,适用于存储和搜索高维向量数据。Milvus Lite 是 Milvus 的轻量级版本,适合本地开发、学习和小规模应用。通过本教案,您将学习如何使用 Milvus Lite 进行基本的向量操作和搜索。
2. 安装 Milvus Lite
步骤 1: 设置 Python 虚拟环境(可选,但推荐)
使用虚拟环境可以隔离项目依赖,避免版本冲突。
# 创建虚拟环境(使用 venv)
python3 -m venv milvus_env
# 激活虚拟环境
# 对于 Linux 和 MacOS
source milvus_env/bin/activate
# 对于 Windows
milvus_env\Scripts\activate
步骤 2: 安装 pymilvus
Milvus Lite
已包含在 pymilvus
库中。使用以下命令安装最新版本:
pip install -U pymilvus
注意:如果您希望显式安装
milvus-lite
包,或者已经安装了较旧版本的 Milvus Lite 并希望更新,可以使用:pip install -U milvus-lite
3. 连接到 Milvus Lite
在 Python 脚本或 Jupyter Notebook 中导入 MilvusClient
并连接到 Milvus Lite。数据将存储在本地文件中,例如 milvus_demo.db
。
from pymilvus import MilvusClient
# 创建一个 MilvusClient 实例,数据将存储在 "milvus_demo.db" 文件中
client = MilvusClient("./milvus_demo.db")
说明:
- 运行上述代码后,会在当前目录下生成一个名为
milvus_demo.db
的数据库文件。 - 这个文件用于存储向量数据和元数据。
4. 创建集合
在 Milvus 中,集合(Collection)用于存储向量及其相关的元数据。创建集合时,需要指定集合名称和向量的维度。
# 检查集合是否已存在,如果存在则删除
if client.has_collection(collection_name="demo_collection"):
client.drop_collection(collection_name="demo_collection")
# 创建一个新的集合
client.create_collection(
collection_name="demo_collection",
dimension=384 # 向量的维度
)
说明:
- 集合名称:
demo_collection
是集合的名称,可以根据需要更改。 - 维度:
dimension=384
指定向量的维度为 384,您可以根据实际需求调整。
5. 准备和插入数据
本节将介绍如何准备向量数据并将其插入到 Milvus Lite 集合中。我们将使用随机向量作为示例。
步骤 1: 导入必要的库
import numpy as np
import random
from pymilvus import MilvusClient
步骤 2: 生成向量数据
为了演示,我们将创建一些文本,并为其生成随机向量表示。
# 创建 MilvusClient 实例
client = MilvusClient("./milvus_demo.db")
# 创建集合(如果尚未创建)
client.create_collection(
collection_name="demo_collection",
dimension=384
)
# 文本数据
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
# 使用随机向量表示(384 维)
vectors = [[random.uniform(-1, 1) for _ in range(384)] for _ in docs]
# 组织数据为实体格式
data = [
{"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
for i in range(len(vectors))
]
print("Data has", len(data), "entities, each with fields:", data[0].keys())
print("Vector dim:", len(data[0]["vector"]))
输出示例:
Data has 3 entities, each with fields: dict_keys(['id', 'vector', 'text', 'subject'])
Vector dim: 384
步骤 3: 插入数据
将准备好的数据插入到 Milvus Lite 集合中。
# 插入数据
res = client.insert(
collection_name="demo_collection",
data=data
)
print(res)
输出示例:
{'insert_count': 3, 'ids': [0, 1, 2], 'cost': 0}
说明:
insert_count
: 插入的实体数量。ids
: 插入实体的主键 ID 列表。cost
: 插入操作的耗时(单位可能是毫秒)。
6. 执行向量搜索
通过向量相似性搜索,您可以找到与查询向量最相似的实体。
# 生成查询向量(使用第一个实体的向量作为示例)
query_vectors = [vectors[0]]
# 执行搜索
res = client.search(
collection_name="demo_collection", # 目标集合
data=query_vectors, # 查询向量
limit=2, # 返回实体数量
output_fields=["text", "subject"], # 指定返回的字段
)
print(res)
输出示例:
data: ["[{'id': 2, 'distance': 0.5859, 'entity': {'text': 'Born in Maida Vale, London, Turing was raised in southern England.', 'subject': 'history'}}, {'id': 1, 'distance': 0.5118, 'entity': {'text': 'Alan Turing was the first person to conduct substantial research in AI.', 'subject': 'history'}}]"] , extra_info: {'cost': 0}
说明:
- 距离度量:默认使用余弦相似度(COSINE),距离越小表示越相似。
- 返回结果:每个查询返回一个结果列表,包含实体的 ID、与查询向量的距离以及指定的字段。
7. 使用元数据过滤
您可以在向量搜索的同时,根据元数据(称为标量字段)进行过滤,以获得更精确的搜索结果。
步骤 1: 插入更多数据
插入主题为 “biology” 的新数据。
# 新的文本数据
new_docs = [
"Machine learning has been used for drug design.",
"Computational synthesis with AI algorithms predicts molecular properties.",
"DDR1 is involved in cancers and fibrosis.",
]
# 使用随机向量表示(384 维)
new_vectors = [[random.uniform(-1, 1) for _ in range(384)] for _ in new_docs]
# 组织数据为实体格式
new_data = [
{"id": 3 + i, "vector": new_vectors[i], "text": new_docs[i], "subject": "biology"}
for i in range(len(new_vectors))
]
# 插入新数据
res = client.insert(
collection_name="demo_collection",
data=new_data
)
print(res)
步骤 2: 执行带过滤条件的搜索
仅返回主题为 “biology” 的实体。
# 生成查询向量(使用第一个实体的向量作为示例)
query_vectors = [vectors[0]]
# 执行带过滤条件的搜索
res = client.search(
collection_name="demo_collection",
data=query_vectors,
filter="subject == 'biology'", # 过滤条件
limit=2,
output_fields=["text", "subject"],
)
print(res)
输出示例:
data: ["[{'id': 4, 'distance': 0.2703, 'entity': {'text': 'Computational synthesis with AI algorithms predicts molecular properties.', 'subject': 'biology'}}, {'id': 3, 'distance': 0.1642, 'entity': {'text': 'Machine learning has been used for drug design.', 'subject': 'biology'}}]"] , extra_info: {'cost': 0}
说明:
- 过滤条件:
filter="subject == 'biology'"
仅返回符合条件的实体。 - 性能提示:默认情况下,标量字段未建立索引。如果在大规模数据集上执行带过滤条件的搜索,建议使用固定模式并开启索引以提升搜索性能。
8. 查询和删除数据
8.1 查询操作
根据标量字段值检索实体
检索所有主题为 “history” 的实体。
# 检索所有 subject 为 'history' 的实体
res = client.query(
collection_name="demo_collection",
filter="subject == 'history'",
output_fields=["text", "subject"],
)
print(res)
通过主键直接检索实体
检索 ID 为 0 和 2 的实体。
# 通过主键 ID 检索实体
res = client.query(
collection_name="demo_collection",
ids=[0, 2],
output_fields=["vector", "text", "subject"],
)
print(res)
8.2 删除实体
按主键删除实体
删除 ID 为 0 和 2 的实体。
# 按主键 ID 删除实体
res = client.delete(
collection_name="demo_collection",
ids=[0, 2]
)
print(res)
按过滤条件删除实体
删除所有主题为 “biology” 的实体。
# 按过滤条件删除 subject 为 'biology' 的实体
res = client.delete(
collection_name="demo_collection",
filter="subject == 'biology'",
)
print(res)
输出示例:
[]
[]
说明:
- 删除操作成功后,返回一个空列表,表示没有剩余的实体符合删除条件。
9. 数据持久化与迁移
Milvus Lite 的数据存储在本地文件中,可以通过重新连接到相同的数据库文件来加载现有数据。
步骤 1: 连接到现有数据
from pymilvus import MilvusClient
# 创建一个 MilvusClient 实例,加载现有的 "milvus_demo.db" 文件
client = MilvusClient("milvus_demo.db")
步骤 2: 删除集合
如果需要删除整个集合及其所有数据,可以使用以下命令:
# 删除集合
client.drop_collection(collection_name="demo_collection")
步骤 3: 导出数据
Milvus Lite 提供了命令行工具,可以将数据导出为 JSON 文件,便于迁移到其他 Milvus 部署。
安装 Bulk Writer
pip install -U "pymilvus[bulk_writer]"
导出数据
milvus-lite dump -d ./milvus_demo.db -c demo_collection -p ./data_dir
参数说明:
-d
,--db-file
:Milvus Lite 数据库文件路径。-c
,--collection
:需要导出的集合名称。-p
,--path
:导出文件的存储目录。
说明:
- 导出的数据可以上传到 Zilliz Cloud 或其他 Milvus 服务器,通过数据导入或批量插入功能进行导入。
10. 实践练习
通过以下练习,您将巩固对 Milvus Lite 的理解和使用。
练习 1: 创建和管理集合
- 创建一个新的集合,命名为
test_collection
,向量维度为 256。 - 检查
test_collection
是否存在。 - 删除
test_collection
。
练习 2: 插入和搜索数据
- 创建一个集合
books_collection
,向量维度为 128。 - 准备五本书的标题,并为每本书生成随机向量。
- 插入数据到
books_collection
。 - 执行向量搜索,查找与某本书标题最相似的两本书。
练习 3: 使用元数据过滤
- 在
books_collection
中添加元数据字段genre
,例如 “fiction”、“non-fiction”。 - 插入包含不同
genre
的书籍数据。 - 执行向量搜索,同时过滤
genre == 'fiction'
。
练习 4: 查询和删除操作
- 查询所有
genre == 'non-fiction'
的书籍。 - 删除某本书籍(通过 ID 或过滤条件)。
- 验证删除是否成功。
11. 总结与下一步
通过本教案,您已经学习了如何在本地环境中安装和使用 Milvus Lite,包括创建集合、插入数据、执行向量搜索、使用元数据过滤以及数据管理操作。以下是关键要点的总结和建议的下一步学习路径:
关键要点总结
- 安装与配置:通过
pymilvus
安装 Milvus Lite,并连接到本地数据库文件。 - 集合管理:创建、检查、删除集合。
- 数据操作:插入、搜索、查询和删除数据。
- 元数据过滤:结合标量字段进行更精确的向量搜索。
- 数据持久化:数据存储在本地文件中,可通过命令行工具导出和迁移。
下一步学习建议
- 深入了解 Milvus 的索引类型:
- 虽然 Milvus Lite 仅支持 FLAT 索引,但了解其他索引类型(如 IVF、HNSW)有助于在服务器部署时进行优化。
- 探索高级功能:
- 学习如何在服务器部署中使用分区、负载均衡和高可用性配置。
- 了解 Milvus 的安全配置,如认证、授权和 TLS 加密。
- 实践项目:
- 构建一个完整的文本搜索应用,结合自然语言处理(NLP)模型生成向量嵌入。
- 开发一个图像搜索系统,使用图像特征向量进行相似性搜索。
- 迁移到生产环境:
- 学习如何在 Docker 或 Kubernetes 上部署 Milvus Standalone 或 Distributed。
- 了解如何使用 Zilliz Cloud 的完全托管 Milvus 服务,简化部署和管理。
- 参与社区和获取支持:
- 加入 Milvus 的官方论坛、Slack 或其他社区渠道,与其他开发者交流经验。
- 阅读官方文档和教程,了解最新的功能和最佳实践。
参考资源
- 官方文档:Milvus 官方文档
- GitHub 仓库:Milvus GitHub
- 社区支持:加入 Milvus 的社区论坛或 Slack 频道,获取帮助和交流经验。
- 教程和示例:Milvus Tutorials
附录: 关键代码示例
为了方便复习,以下是本教案中涉及的关键代码示例的汇总。
连接到 Milvus Lite
from pymilvus import MilvusClient
client = MilvusClient("./milvus_demo.db")
创建集合
client.create_collection(
collection_name="demo_collection",
dimension=384
)
插入数据
import random
docs = [
"Artificial intelligence was founded as an academic discipline in 1956.",
"Alan Turing was the first person to conduct substantial research in AI.",
"Born in Maida Vale, London, Turing was raised in southern England.",
]
vectors = [[random.uniform(-1, 1) for _ in range(384)] for _ in docs]
data = [
{"id": i, "vector": vectors[i], "text": docs[i], "subject": "history"}
for i in range(len(vectors))
]
res = client.insert(
collection_name="demo_collection",
data=data
)
print(res)
执行向量搜索
query_vectors = [vectors[0]]
res = client.search(
collection_name="demo_collection",
data=query_vectors,
limit=2,
output_fields=["text", "subject"],
)
print(res)
使用元数据过滤的向量搜索
# 插入更多数据
new_docs = [
"Machine learning has been used for drug design.",
"Computational synthesis with AI algorithms predicts molecular properties.",
"DDR1 is involved in cancers and fibrosis.",
]
new_vectors = [[random.uniform(-1, 1) for _ in range(384)] for _ in new_docs]
new_data = [
{"id": 3 + i, "vector": new_vectors[i], "text": new_docs[i], "subject": "biology"}
for i in range(len(new_vectors))
]
client.insert(
collection_name="demo_collection",
data=new_data
)
# 带过滤条件的搜索
res = client.search(
collection_name="demo_collection",
data=[vectors[0]],
filter="subject == 'biology'",
limit=2,
output_fields=["text", "subject"],
)
print(res)
查询操作
# 根据标量字段值检索
res = client.query(
collection_name="demo_collection",
filter="subject == 'history'",
output_fields=["text", "subject"],
)
print(res)
# 通过主键检索
res = client.query(
collection_name="demo_collection",
ids=[0, 2],
output_fields=["vector", "text", "subject"],
)
print(res)
删除实体
# 按主键删除
res = client.delete(
collection_name="demo_collection",
ids=[0, 2]
)
print(res)
# 按过滤条件删除
res = client.delete(
collection_name="demo_collection",
filter="subject == 'biology'",
)
print(res)
删除集合
client.drop_collection(collection_name="demo_collection")
迁移数据
pip install -U "pymilvus[bulk_writer]"
# 导出数据
milvus-lite dump -d ./milvus_demo.db -c demo_collection -p ./data_dir