Milvus实操

news2024/11/25 11:26:58

概念


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 部署。

步骤:

  1. 安装 Bulk Writer

    pip install -U "pymilvus[bulk_writer]"
    
  2. 导出数据

    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:支持多种一致性级别,如 WeakSession 等。

说明:

  • 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 的核心概念及其功能。以下是关键要点的总结:

  1. 集合(Collection):Milvus 中存储向量和元数据的基本单位,类似于关系数据库中的表。
  2. 索引(Index):用于加速向量相似性搜索,支持多种索引类型。
  3. 分区(Partition)**与**副本(Replica):用于数据的逻辑划分和高可用性,Milvus Lite 不支持分区和副本。
  4. 实体(Entity)**与**属性(Attribute):Milvus 中的数据记录及其具体字段。
  5. 向量数据与标量数据:向量用于相似性搜索,标量用于描述和过滤。
  6. CRUD 操作:包括创建、读取、更新和删除数据。
  7. 一致性级别与距离度量:定义数据的一致性保证和向量相似性的衡量方式。
  8. 数据类型:Milvus 支持多种向量和标量数据类型。
  9. 数据加载与释放:管理数据在内存中的加载和释放,以优化性能。
  10. 监控与管理工具:使用工具如 Birdwatcher、Prometheus、Grafana 和 Attu 进行 Milvus 的监控和管理。

Milvus Lite 入门教案

课程结构

  1. 课程简介
  2. 安装 Milvus Lite
  3. 连接到 Milvus Lite
  4. 创建集合
  5. 准备和插入数据
  6. 执行向量搜索
  7. 使用元数据过滤
  8. 查询和删除数据
  9. 数据持久化与迁移
  10. 实践练习
  11. 总结与下一步

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: 创建和管理集合
  1. 创建一个新的集合,命名为 test_collection,向量维度为 256。
  2. 检查 test_collection 是否存在。
  3. 删除 test_collection
练习 2: 插入和搜索数据
  1. 创建一个集合 books_collection,向量维度为 128。
  2. 准备五本书的标题,并为每本书生成随机向量。
  3. 插入数据到 books_collection
  4. 执行向量搜索,查找与某本书标题最相似的两本书。
练习 3: 使用元数据过滤
  1. books_collection 中添加元数据字段 genre,例如 “fiction”、“non-fiction”。
  2. 插入包含不同 genre 的书籍数据。
  3. 执行向量搜索,同时过滤 genre == 'fiction'
练习 4: 查询和删除操作
  1. 查询所有 genre == 'non-fiction' 的书籍。
  2. 删除某本书籍(通过 ID 或过滤条件)。
  3. 验证删除是否成功。

11. 总结与下一步

通过本教案,您已经学习了如何在本地环境中安装和使用 Milvus Lite,包括创建集合、插入数据、执行向量搜索、使用元数据过滤以及数据管理操作。以下是关键要点的总结和建议的下一步学习路径:

关键要点总结
  • 安装与配置:通过 pymilvus 安装 Milvus Lite,并连接到本地数据库文件。
  • 集合管理:创建、检查、删除集合。
  • 数据操作:插入、搜索、查询和删除数据。
  • 元数据过滤:结合标量字段进行更精确的向量搜索。
  • 数据持久化:数据存储在本地文件中,可通过命令行工具导出和迁移。
下一步学习建议
  1. 深入了解 Milvus 的索引类型
    • 虽然 Milvus Lite 仅支持 FLAT 索引,但了解其他索引类型(如 IVF、HNSW)有助于在服务器部署时进行优化。
  2. 探索高级功能
    • 学习如何在服务器部署中使用分区、负载均衡和高可用性配置。
    • 了解 Milvus 的安全配置,如认证、授权和 TLS 加密。
  3. 实践项目
    • 构建一个完整的文本搜索应用,结合自然语言处理(NLP)模型生成向量嵌入。
    • 开发一个图像搜索系统,使用图像特征向量进行相似性搜索。
  4. 迁移到生产环境
    • 学习如何在 Docker 或 Kubernetes 上部署 Milvus Standalone 或 Distributed。
    • 了解如何使用 Zilliz Cloud 的完全托管 Milvus 服务,简化部署和管理。
  5. 参与社区和获取支持
    • 加入 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

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2247261.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Linux---ps命令

​​​​​​Linux ps 命令 | 菜鸟教程 (runoob.com) process status 用于显示进程的状态 USER: 用户名,运行此进程的用户名。PID: 进程ID(Process ID),每个进程的唯一标识号%CPU: 进程当前使用的CPU百分比%MEM: 进程当前使用的…

VLAN是什么,一个好的网络为什么要划分VLAN呢?

前言 在上一篇中讲解了交换机的工作原理,知道了交换机处理数据的转发方式,其中有两种情况会以广播方式进行发送数据,第一种是目的MAC是全F的,以及组播MAC,第二种是未知单播帧,那这个会带来什么样的问题呢&…

衡山派D133EBS 开发环境安装及SDK编译烧写镜像烧录

1.创建新文件夹,用来存放SDK包(其实本质就是路径要对就ok了),右键鼠标通过Open Git Bash here来打开git 输入命令 git clone --depth1 https://gitee.com/lcsc/luban-lite.git 来拉取,如下所示:&#xff0…

基于Gradle搭建Spring6.2.x版本源码阅读环境

前言 阅读源码是程序猿成长的必经一环,正所谓知其然知其所以然。我们在开发成长道路上不仅需要知道如何使用,更要懂得其背后的原理,如此方可得心应手。本篇文章旨在指导大家搭建Spring6.0以上版本的源码阅读环境,方便大家在学习源…

C++自动化测试:GTest 与 GitLab CI/CD 的完美融合

在现代软件开发中,自动化测试是保证代码质量和稳定性的关键手段。对于C项目而言,自动化测试尤为重要,它能有效捕捉代码中的潜在缺陷,提高代码的可维护性和可靠性。本文将重点介绍如何在C项目中结合使用Google Test(GTe…

ubuntu16.04在ros使用USB摄像头-解决could not open /dev/video0问题

首先检查摄像头 lsusb 安装 uvc camera 功能包 sudo apt-get install ros-indigo-uvc-camera 安装 image 相关功能包 sudo apt-get install ros-kinetic-image-* sudo apt-get install ros-kinetic-rqt-image-view运行 uvc_camera 节点 首先输入roscore 然后另外开一个终端输入…

Linux:文件管理(二)——文件缓冲区

目录 一、缓冲区概念 二、缓冲区刷新机制 三、用缓冲区刷新解释下面现象。 一、缓冲区概念 缓冲区,本质就是一块内存区域。 设计缓冲区就是为了让本来要一次一次传的数据,都暂时传到缓冲区,让缓冲区刷新一次,这样只发生了一次传…

PH热榜 | 2024-11-24

DevNow 是一个精简的开源技术博客项目模版,支持 Vercel 一键部署,支持评论、搜索等功能,欢迎大家体验。 在线预览 1. AutoFlow Studio 标语:借助简化的AI质检,更快发布产品,更聪明地进行测试。 介绍&…

hubuctf-2024校赛-复现wp

web easyweb1 <?php error_reporting(0); highlight_file(__FILE__);$flag getenv("GZCTF_FLAG");if(isset($_GET[num])){$num $_GET[num];if(preg_match("/[0-9]/", $num)){die("You are failed.");}if(intval($num)){echo $flag;} } 利…

飞书会话消息左右排列

飞书会话消息左右排列 1. 飞书登录后&#xff0c;点击头像&#xff0c;弹出菜单有个按钮设置 2. 3.

《图像形态学运算全解析:原理、语法及示例展示》

简介&#xff1a; 本文详细介绍了图像形态学中的多种运算&#xff0c;包括腐蚀、膨胀、开运算、闭运算、形态学梯度运算、礼帽运算以及黑帽运算。分别阐述了各运算的原理、语法格式&#xff0c;并通过 Python 代码结合具体示例图片&#xff08;如erode.JPG、dilate.JPG、close.…

链路聚合实验

1、聚合方式 &#xff08;1&#xff09;、lacp 静态链路聚合、 动态链路聚合&#xff08;开启lacp模式&#xff0c;常用&#xff09; &#xff08;2&#xff09;、手工负载分担 静态端口聚合&#xff08;两台交换机都按照下面的命令配置&#xff09; <H3C>sys System Vi…

电子电气架构 -- ASIL D安全实现策略

我是穿拖鞋的汉子&#xff0c;魔都中坚持长期主义的汽车电子工程师。 老规矩&#xff0c;分享一段喜欢的文字&#xff0c;避免自己成为高知识低文化的工程师&#xff1a; 所有人的看法和评价都是暂时的&#xff0c;只有自己的经历是伴随一生的&#xff0c;几乎所有的担忧和畏惧…

禁止Chrome的自动升级

一、需求分析 因为用Chromeselenium做了网页自动化填写任务&#xff0c;如果Google Chrome浏览器自动升级&#xff0c;就会导致chromedriver加载失败&#xff0c;自动化任务失效&#xff0c;因此需要禁止Chrome浏览器的自动升级。 二、当前环境 三、实际配置 运行注册表编辑…

C0034.在Ubuntu中安装的Qt路径

Qt安装路径查询 在终端输入qmake -v如上中/usr/lib/x86_64-linux-gnu就是Qt的安装目录&#xff1b;

C++从零到满绩——类和对象(中)

目录 1>>前言 2>>构造函数&#xff08;我称之为初始化函数&#xff09; 3>>析构函数&#xff08;我称之为销毁函数&#xff09; 4>>拷贝构造函数&#xff08;我称之为复制函数&#xff09; 5>>运算符重载 5.2>>赋值运算符重载 ​编辑…

oracle 12c查看执行过的sql及当前正在执行的sql

V$SQL 提供了已经执行过及正在执行的SQL语句的信息。 一 查看共享池中所有sql的统计信息 #统计共享池中某类sql执行次数&#xff0c;总体执行时长&#xff0c;平均执行时长等信息&#xff0c;并按总体执行时长降序排序 SELECT INST_ID,SQL_ID,SQL_TEXT,SQL_FULLTEXT,EXECUTI…

解锁PPTist的全新体验:Windows系统环境下本地部署与远程访问

文章目录 前言1. 本地安装PPTist2. PPTist 使用介绍3. 安装Cpolar内网穿透4. 配置公网地址5. 配置固定公网地址 前言 在Windows系统环境中&#xff0c;如何本地部署开源在线演示文稿应用PPTist&#xff0c;并实现远程访问&#xff1f;本文将为您提供详细的部署和配置指南。 P…

C语言中的指针和字符串的赋值

前言&#xff1a;温习下以前学过的C语言知识&#xff0c;温故而知新。 实例说明 本文用一段实例代码阐述指针和字符串的联系。 #include <iostream> #include <cstring> int main() {using namespace std;char animal[20] "bear";const char * bird …

Linux高阶——1117—TCP客户端服务端

目录 1、sock.h socket常用函数 网络初始化函数 首次响应函数 测试IO处理函数 获取时间函数 总代码 2、sock.c SOCKET() ACCEPT()——服务端使用这个函数等待客户端连接 CONNECT()——客户端使用这个函数连接服务端 BIND()——一般只有服务端使用 LISTEN()——服务端…