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, DataTypefields = [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 MilvusClientclient = MilvusClient("./milvus_demo.db")
创建集合
client.create_collection(collection_name="demo_collection",dimension=384
)
插入数据
import randomdocs = ["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
相关文章:
Milvus实操
概念 Milvus 关键概念优化笔记 Milvus 是一个高性能、可扩展的开源向量数据库,专为处理海量向量数据和执行相似性搜索而设计。以下是 Milvus 中的一些核心概念及其详细解释。 1. 集合(Collection) 定义: 集合是 Milvus 中存储向…...
35 基于单片机的精确电压表DA-AD转换
目录 一、主要功能 二、硬件资源 三、程序编程 四、实现现象 一、主要功能 基于51单片机,采用DAC0832和ADC0832检测电压,0到8.5V,设计复位电路 LED管显示实际稳压值,初始电压0 二、硬件资源 基于KEIL5编写C代码,…...
JDBC 设置 PostgreSQL 查询中 any(?) 的参数
这段时间都纠缠于 Java 如何操作 PostgreSQL 数据库上,千方百计的为求得更好的性能。为此我们用上了 Batch, 或用 id any(?) 这种更 PostgreSQL 化的数组参数操作。其实它还有更多数组方面的花样可以玩,毕竟 PostgreSQL 数据库有一种广纳百川的胸怀&am…...
【11-20期】Java面试进阶:深入解析核心问题与实战案例
🚀 作者 :“码上有前” 🚀 文章简介 :Java 🚀 欢迎小伙伴们 点赞👍、收藏⭐、留言💬 文章题目:Java面试进阶:深入解析11-20期核心问题与实战案例 摘要: 本篇…...
C++——内存池_2
C内存池 重载 new 和 delete 运算符C内存池使用内存池的目的逐步实现内存池 重载 new 和 delete 运算符 实际开发中,重载new和delete的主要目的是实现内存池。内存池在高性能的服务程序中很常用。点击浏览重载 new 和 delete 运算符的内容,建议先看这部…...
如何使用PHP爬虫获取店铺详情:一篇详尽指南
在数字化时代,数据的价值不言而喻。对于企业来说,获取竞争对手的店铺详情、顾客评价等信息对于市场分析和决策至关重要。PHP作为一种广泛使用的服务器端脚本语言,结合其强大的库支持,使得编写爬虫程序变得简单而高效。本文将详细介…...
HTML5和CSS3新增特性
HTML5的新特性 HTML5新增的语义化标签 HTML5 的新增特性主要是针对于以前的不足,增加了一些新的标签、新的表单和新的表单属性等。 这些新特性都有兼容性问题,基本是 IE9 以上版本的浏览器才支持,如果不考虑兼容性问题,可以大量…...
linux运行vue编译后的项目
如果你的 Vue 项目使用了 history 模式(而非默认的 hash 模式),在纯静态服务器中会出现类似的问题。因为 Vue Router 的 history 模式要求所有未匹配的路径都重定向到 index.html,以便 Vue 前端处理路径。 首先在本地执行npm run…...
论文阅读:A Software Platform for Manipulating theCamera Imaging Pipeline
论文代码开源链接: A Software Platform for Manipulating the Camera Imaging Pipelinehttps://karaimer.github.io/camera-pipeline/摘要:论文提出了一个Pipline软件平台,可以方便地访问相机成像Pipline的每个阶段。该软件允许修改单个模块…...
【MySQL篇】持久化和非持久化统计信息的深度剖析(第一篇,总共六篇)
💫《博主介绍》:✨又是一天没白过,我是奈斯,DBA一名✨ 💫《擅长领域》:✌️擅长Oracle、MySQL、SQLserver、阿里云AnalyticDB for MySQL(分布式数据仓库)、Linux,也在扩展大数据方向的知识面✌️…...
Ubuntu下安装Qt
1.如图1所示,在Index of /archive上下载安装包; 图1 2.将图1安装包下载好之后,通过共享文件夹的方式拷贝到ubutntu,如图2所示; 图2 3.如图3所示,执行chmod x qt-creator-opensource-linux-x86_64-10.0.2.…...
丹摩征文活动 | AI创新之路,DAMODEL助你一臂之力GPU
目录 前言—— DAMODEL(丹摩智算) 算力服务 直观的感受算力提供商的强大 平台功能介绍 镜像选择 云磁盘创建 总结 前言—— 只需轻点鼠标,开发者便可拥有属于自己的AI计算王国 - 从丰富的GPU实例选择,到高性能的云磁盘,再到预配置的深度学习…...
数据库(总结自小林coding)|索引失效的场景、慢查询、原因及如何优化?undo log、redo log、binlog 作用、MySQL和Redis的区别
数据库(总结自小林coding)|索引失效的场景、慢查询、原因及如何优化?undo log、redo log、binlog 作用、MySQL和Redis的区别 说一下索引失效的场景?什么是慢查询?原因是什么?可以怎么优化?undo …...
Docker容器运行CentOS镜像,执行yum命令提示“Failed to set locale, defaulting to C.UTF-8”
最近对运维比较感兴趣,以前虽然对公司负责的项目做过运维工作,但用的都是最原始的方法,例如是在阿里云服务器上直接安装jdk,tomcat,redis ,nginx 。这种方式对不大的项目还能够支持,随着项目变大,服务增加&…...
OpenCV基本图像处理操作(六)——直方图与模版匹配
直方图 cv2.calcHist(images,channels,mask,histSize,ranges) images: 原图像图像格式为 uint8 或 float32。当传入函数时应 用中括号 [] 括来例如[img]channels: 同样用中括号括来它会告函数我们统幅图 像的直方图。如果入图像是灰度图它的值就是 [0]如果是彩色图像 的传入的…...
【LLM学习笔记】第四篇:模型压缩方法——量化、剪枝、蒸馏、分解
文章目录 1. 为什么要进行模型压缩2. 模型量化2.1 常见数据类型2.2 浮点数表示2.3 线性量化2.4 非线性量化2.5 挑战2.6 实际应用 3. 模型剪枝4. 模型蒸馏4.1 模型蒸馏的基本流程4.2 模型蒸馏的优势4.3 实际应用 5. 低秩分解(低秩近似)5.1 基本概念5.2 实…...
python3 自动更新的缓存类
这个类会在后台自动更新缓存数据,你只需要调用方法来获取数据即可。 自动更新缓存类 以下是 AutoUpdatingCache 类的实现: import threading import timeclass AutoUpdatingCache:def __init__(self, update_function, expiry_time60):""&qu…...
英语知识网站开发:Spring Boot框架应用
3系统分析 3.1可行性分析 通过对本英语知识应用网站实行的目的初步调查和分析,提出可行性方案并对其一一进行论证。我们在这里主要从技术可行性、经济可行性、操作可行性等方面进行分析。 3.1.1技术可行性 本英语知识应用网站采用SSM框架,JAVA作为开发语…...
文件上传upload-labs-docker通关
(图片加载不出,说明被和谐了) 项目一: sqlsec/ggctf-upload - Docker Image | Docker Hub 学习过程中,可以对照源码进行白盒分析. 补充:环境搭建在Linux虚拟机上的同时,以另一台Windows虚拟机进行测试最…...
git(Linux)
1.git 三板斧 基本准备工作: 把远端仓库拉拉取到本地了 .git --> 本地仓库 git在提交的时候,只会提交变化的部分 就可以在当前目录下新增代码了 test.c 并没有被仓库管理起来 怎么添加? 1.1 git add test.c 也不算完全添加到仓库里面&…...
Doris实战—构建日志存储与分析平台
构建日志存储与分析平台 日志是系统运行的详细记录,包含各种事件发生的主体、时间、位置、内容等关键信息。出于运维可观测、网络安全监控及业务分析等多重需求,企业通常需要将分散的日志采集起来,进行集中存储、查询和分析,以进一步从日志数据里挖掘出有价值的内容。 针…...
【vue3+Typescript】unapp+stompsj模式下替代plus-websocket的封装模块
由于plus-websocket实测存在消息丢失的问题,只能寻找替代的方案,看文章说使用原生的即可很好的工作。而目前在stompjs里需要使用websocket类型的封装模块,看了下原来提供的接口,采用uniapp原生的websocket模式,对原模块…...
Tcon技术和Tconless技术介绍
文章目录 TCON技术(传统时序控制器)定义:主要功能:优点:缺点: TCONless技术(无独立时序控制器)定义:工作原理:优点:缺点: TCON与TCONl…...
C#-利用反射自动绑定请求标志类和具体执行命令类
文章速览 概述例程请求类命名空间父类示例子类示例 命令类命名空间子类示例 记录的数据结构实现绑定方法 坚持记录实属不易,希望友善多金的码友能够随手点一个赞。 共同创建氛围更加良好的开发者社区! 谢谢~ 概述 需求: 将指定的两种类型的…...
高中数学练习:初探均值换元法
文章目录 1. 均值换元法定义2. 均值换元法优点3. 均值换元法应用4. 均值换元法示例4.1 求解分式方程4.2 求解指数方程4.3 计算最大值 5. 实战小结 1. 均值换元法定义 均值换元法是一种数学技巧,通过引入新变量 t t t将两个变量 x x x和 y y y表示为它们的平均值加上…...
数据结构单链表,顺序表,广义表,多重链表,堆栈的学习
单链表 比如一个多项式,主要包括x的系数,x的指数,那么可以创建一个一维数组来存储它的系数和指数,用数组下标来表示。它的系数可以用数组下标对应的数组元素来储存。 可是这样储存会浪费空间所以采用单链表形式来存储。 即创建一…...
【保姆级教程】使用lora微调LLM并在truthfulQA数据集评估(Part 2.在truthfulQA上评估LLM)
上一期我们成功用lora微调了一个模型传送门,怎样评估模型呢?目前LLM没有一个统一的BENCHMARK。我们今天选用truthfulQA。 truthfulQA数据集格式如下所示 {question: What is the smallest country in the world that is at least one square mile in ar…...
thinkphp中对请求封装
请求的封装 //调用 $res Http::post($this->baseUrl . $url,$params,[CURLOPT_HTTPHEADER > [Content-Type: application/json,Content-Length: . strlen($params),],]);<?php namespace fast; /*** 字符串类*/ class Http {/*** 发送一个POST请求*/public static …...
leetcode hot100【LeetCode 215.数组中的第K个最大元素】java实现
LeetCode 215.数组中的第K个最大元素 题目描述 给定一个整数数组 nums 和一个整数 k,请返回数组中第 k 个最大的元素。 请注意,要求排名是从大到小的,因此第 k 个最大元素是排序后的第 k 个元素。你需要设计一个高效的算法来解决这个问题。…...
簡單易懂:如何在Windows系統中修改IP地址?
無論是為了連接到一個新的網路,還是為了解決網路連接問題,修改IP地址都是一個常見的操作。本文將詳細介紹如何在Windows系統中修改IP地址,包括靜態IP地址的設置和動態IP地址的獲取。 IP地址是什麼? IP地址是互聯網協議地址的簡稱…...
南昌企业建站/seo课程培训
题面 \(Solution:\) 一开始想的是先跑一遍最短路,然后拆点之后再跑一遍,比较两次dis,然后发现拆点后会有负环(可能是我没想对拆点的方法),于是就放弃了拆点法。 我们考虑强制让每头牛选择走一条最短的,有草堆的路径&am…...
python做网站缺点/百度seo原理
前言 上篇对SOA的概述里面,在说SOA构建需要考虑什么时,提到了ESB,它作为SOA的基础设施而存在。 从这篇开始,将对ESB的其中一个实现JBossESB进行一个从头开始的讲解,既然是从头开始,那么不可或缺的就是环境的…...
网站登记查询/网站优化系统
软件名称:二维码识别精灵1.0 功能 识别: 1.从摄像头识别二维码、条码 2.从文件读取二维码、条码 3.识别屏幕中的二维码、条码 生成:文本生成二维码 支持导出为图片 特点 1.绿色软件,免安装,使用简单,…...
如何作wordpress 主题/网站排名怎么搜索靠前
在不同环境部署项目时,由于不同的配置,部署时难免会改变部署的方式,而且基本使用版本管理工具,比如git或svn进行下拉代码部署项目时,尽可能的不变动代码(如果变动代码,下次下拉代码前必须要使用…...
政府信息公开和网站建设工作总结/无锡网络优化推广公司
本章介绍一下产品生成器模块的几张报表。构成元素这张报表用来打印产品模型的内容,也可以用来查看可建模物料的概况。只有处在激活状态的产品模型会被打印。操作路径产品生成器->报表->构成元素如上图所示可以选择打印产品模型的详细信息,可以选择…...
林州网站制作/百度一下你就知道官网百度
本文转自:http://www.cnblogs.com/ganqiyin/p/3680771.html 原址:http://www.nopcommerce.com/docs/77/how-to-write-a-nopcommerce-plugin.aspx plug-in (或 plugin)是一个为更大的软件应用程序添加特定的能力的组件(Wikipedia) 插件是用来扩展nopComme…...