管理向量Indexes

更新时间:

本篇为您介绍如何在Milvus中为向量字段创建索引,以实现对向量元数据的有效过滤。向量索引专注于通过先进的索引结构和算法(如IVF、HNSW等),有效压缩向量空间并加速在海量数据中定位与查询向量最相似的数据点,极大地提升了诸如图像识别、语音检索、推荐系统等应用场景中的召回率与响应速度。

背景信息

Milvus支持多种索引类型以实现高效的相似性检索,并提供了三种度量方式来计算向量之间的距离,包括Cosine Similarity(COSINE)、Euclidean Distance(L2)和Inner Product(IP)。建议在经常用于查询的向量字段和标量字段上创建索引,以优化检索性能。

前提条件

  • 已在本地客户端成功安装了PyMilvus库,并将其更新至当前最新版本。

    如果您尚未在本地客户端安装PyMilvus库,或者需要将其更新至当前最新版本,您可以执行以下命令。

    pip install --upgrade pymilvus
  • 已创建Milvus实例,请参见详情快速创建Milvus实例

前期准备

在索引管理之前,您需要先创建好Collection。在创建Collection时,如果在请求中明确指定创建并立即加载索引(index),您需要同时声明向量字段的维度和度量类型(dimensionmetric_type)或提供与索引相关的参数。以下代码片段并未包含这些参数,因此创建的collection将不具备索引,且不会被自动加载至内存。

  • 声明向量字段的维度和metric_type属性。

  • 声明schema和index相关参数。

from pymilvus import MilvusClient, DataType

client = MilvusClient(
    uri="http://c-xxxx.milvus.aliyuncs.com:19530",  # Milvus实例的公网地址。
    token="<yourUsername>:<yourPassword>",  # 登录Milvus实例的用户名和密码。
    db_name="default"  # 待连接的数据库名称,本文示例为默认的default。
)

schema = MilvusClient.create_schema(
    auto_id=False,
    enable_dynamic_field=True,
)

schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vec", datatype=DataType.FLOAT_VECTOR, dim=5)

client.create_collection(
    collection_name="<yourCollectioNname>",
    schema=schema,
)

创建索引

您可以调用create_index函数指定所需的index参数来创建索引。

index_params = MilvusClient.prepare_index_params()
# 定义索引参数。
index_params.add_index(
    field_name="vec",          # 指定向量字段名,例如"vec"。
    metric_type="L2",          # 设置度量类型,例如L2。
    index_type="IVF_PQ",       # 设置索引类型,例如IVF_PQ。
    index_name="vector_index"  # 根据实际情况设置索引名称。
)

# 创建索引。
client.create_index(
    collection_name="<yourCollectionname>",
    index_params=index_params
)

查看索引

res = client.describe_index(
    collection_name="<yourCollectionname>",
    index_name="<yourIndexname>"
)

print(res)

删除索引

client.drop_index(
    collection_name="<yourCollectionname>",
    index_name="<yourIndexname>"
)