上一篇文章 [一篇文章带你学会向量数据库Milvus(一)]我们我们学习了 Milvus 向量数据库的数据库管理,集合管理,schema 管理。这一篇文章我们继续学习向量数据库的其他内容。
索引管理
Milvus 提供多种索引类型来对字段值进行排序,以实现高效的相似性搜索。它还提供三种度量类型:余弦相似度 (COSINE)、欧几里得距离 (L2) 和内积 (IP)来测量向量嵌入之间的距离。
建议对经常使用的向量字段和标量字段创建索引
如果集合创建请求中指定了以下任一条件,Milvus
在创建集合时会自动生成索引并将其加载到内存中:
- 向量的维度和类型
- schema 和索引参数
下面的代码片段重新调整了现有代码的用途,以建立与 Milvus 实例的连接并创建一个集合,而无需指定其索引参数。在这种情况下,集合缺少索引并且保持卸载状态。
ini复制代码 from pymilvus import MilvusClient, DataType
# 实例化客户端,连接 Milvus 服务
client = MilvusClient(
uri="http://localhost:19530"
)
# 创建 schema
schema = MilvusClient.create_schema(
auto_id=False,
enable_dynamic_field=True,
)
# schema 添加字段 id、vector
schema.add_field(field_name="id", datatype=DataType.INT64, is_primary=True)
schema.add_field(field_name="vector", datatype=DataType.FLOAT_VECTOR, dim=5)
# 创建集合
client.create_collection(
collection_name="demo_v4",
schema=schema,
)
集合索引
要为集合创建索引或为集合建立索引,我们需要设置索引参数并调用create_index()
。
ini复制代码 # 设置索引的参数
index_params = MilvusClient.prepare_index_params()
# 在向量字段 vector 上面添加一个索引
index_params.add_index(
field_name="vector",
metric_type="COSINE",
index_type=,
index_name="vector_index"
)
# 在集合demo_v4创建索引文件
client.create_index(
collection_name="demo_v4",
index_params=index_params
)
Milvus 目前只支持为集合的每个字段创建一个索引文件
查看索引详细信息
创建索引后我们可以检索索引的详细信息:
ini复制代码 res = client.list_indexes(
collection_name="demo_v4"
)
# Output
#
# [
# "vector_index",
# ]
res = client.describe_index(
collection_name="demo_v4",
index_name="vector_index"
)
# Output
#
# {
# "index_type": ,
# "metric_type": "COSINE",
# "field_name": "vector",
# "index_name": "vector_index"
# }
我们可以查看针对特定字段创建的索引文件,并统计使用该索引简历的索引行数。类比 关系性数据库的索引。
删除索引
如果不在需要索引,我们可以删除相关的索引
ini复制代码 client.drop_index(
collection_name="demo_v4",
index_name="vector_index"
)
检索标量字段
什么是标量字段?变量字段就是除 vector 字段,id 字段之外的字段。在 Milvus 中,标量索引用于加速特定非向量字段值的元过滤,类似于传统的数据库索引。
变量索引类型
auto-index
Milvus 根据标量字段的数据类型自动决定索引类型。这适用于不需要控制具体索引类型的情况。custom-index
可以指定明确的索引类型,比如倒排索引。这就提供了对索引的类型的更多选择。
Auto index 自动索引
要使用自动索引,请省略 index_type 参数,以便 Milvus
可以根据标量字段类型推断索引类型。
例子:
ini复制代码 # Auto indexing
client = MilvusClient(
uri="http://localhost:19530"
)
#准备一个空的IndexParams对象,无需指定任何索引参数。
index_params = client.create_index_params()
index_params.add_index(
field_name="scalar_1", # 要索引的标量字段的名称
index_type="", # 要创建的索引类型。对于自动索引,请将其留空或省略此参数。
index_name="default_index" # 要创建的指数名称
)
# 在集合中添加索引
client.create_index(
collection_name="demo_v4", # 指定集合名称
index_params=index_params
)
自定义索引
如果我们要使用自定义索引,请在 index_type 参数中指定特定索引类型。
看下面的例子:
ini复制代码 index_params = client.create_index_params() # 准备一个 IndexParams 对象
index_params.add_index(
field_name="scalar_2", # 标量字段名称
index_type="INVERTED", # 明确索引类型
index_name="inverted_index" # 索引的名称
)
client.create_index(
collection_name="demo_v4", # 将索引添加到集合中
index_params=index_params
)
对于自定义索引,有效值为:
- INVERTED:(推荐)倒排索引由术语词典组成,其中包含按字母顺序排序的所有标记化单词。有关详细信息,请参阅标量索引。
- STL_SORT:使用标准模板库排序算法对标量字段进行排序。支持布尔和数字字段(例如 INT8、INT16、INT32、INT64、FLOAT、DOUBLE)。
- Trie:用于快速前缀搜索和检索的树形数据结构。支持 VARCHAR 字段。
索引检索
使用 list_indexes() 方法验证标量索引的创建:
ini复制代码 client.list_indexes(
collection_name="demo_v4" # 指定集合名称
)
# Output:
# ['default_index','inverted_index']
索引限制
目前,标量索引支持 INT8
、INT16
、INT32
、INT64
、FLOAT
、DOUBLE
、BOOL
和 VARCHAR
数据类型,但不支持 JSON
和 ARRAY
类型。
数据 CRUD
在 Milvus 集合的上下文中,实体是集合中单个、可识别的实例。它代表特定类别的独特成员,无论是图书馆中的一本书、基因组中的基因还是任何其他可识别的实体。
集合中的实体共享一组通用的属性,称为schema,概述了每个实体必须遵守的结构,包括字段名称、数据类型和任何其他约束。
将实体成功插入集合中要求提供的数据应包含目标集合的所有架构定义字段。此外,仅当您启用了动态字段时,您还可以包含非架构定义的字段。