创建、删除索引

本页提供创建或删除索引的 Python 示例代码。

创建索引

目前,一个集合只支持一种索引类型,切换索引类型会自动删除旧的索引文件。在创建其它索引前,FLAT 作为集合的默认索引类型。

create_index() 会指定该集合的索引类型,并同步为之前插入的数据建立索引,后续插入的数据在大小达到 index_file_size 时,索引会在后台自动建立。在实际生产环境中,如果是流式数据,建议在插入向量之前先创建索引,以便后续系统自动建立;如果是静态数据,建议导入所有数据后再一次性创建索引。更多索引用法请参考 索引示例程序
  1. 准备创建索引所需参数(以 IVF_FLAT 为例)。索引参数是一个 JSON 字符串,在 Python SDK 中以字典来表示。

    # Prepare index param.
    >>> ivf_param = {'nlist': 16384}
    
    对于不同的索引类型,创建索引所需参数也有区别。所有的索引参数都必须赋值
    索引类型 索引参数 示例参数 取值范围
    IVF_FLAT / IVF_SQ8 / IVF_SQ8H nlist:建立索引时对向量数据文件进行聚类运算的分簇数。索引文件会记录聚类运算后的结果,包括索引的类型,每个簇的中心向量,以及每个簇分别有哪些向量,以便于后期搜索。 {nlist: 16384} nlist:[1, 65536]
    IVF_PQ nlist:建立索引时对向量数据文件进行聚类运算的分簇数。索引文件会记录聚类运算后的结果,包括索引的类型,每个簇的中心向量,以及每个簇分别有哪些向量,以便于后期搜索。

    m:建立索引时数据的压缩率。m 越小压缩率越高。
    {nlist: 16384, m: 12} nlist:[1, 65536]

    m: {96, 64, 56, 48, 40, 32, 28, 24, 20, 16, 12, 8, 4, 3, 2, 1} 中的值,并且分解出的低维向量空间的维度须在 {1, 2, 3, 4, 6, 8, 10, 12, 16, 20, 24, 28, 32} 内。此外,用 GPU 计算时,m x 1024 的值还不能超过显卡的 MaxSharedMemPerBlock。
    RNSG search_length:值越大,代表在图中搜索的节点越多,召回率越高,但速度也越慢。建议 search_length 小于 candidate_pool 的值,取值范围建议在 [40, 80]。

    out_degree:值越大,则占用内存越大,搜索性能也越好。

    candidate_pool:影响索引质量,建议取值范围 [200,500]。

    knng:影响索引质量,建议取值为 out_degree + 20。
    {search_length: 45, out_degree:50, candidate_pool_size:300, knng:100} search_length: [10, 300]

    out_degree: [5, 300]

    candidate_pool_size: [50, 1000]

    knng: [5, 300]
    HNSW M:影响 build 的时间以及索引的质量。 M 越大,构建索引耗时越长,索引质量越高,内存占用也越大。

    efConstruction:影响 build 的时间以及索引的质量。 efConstruction 越大,构建索引耗时越长,索引质量越高,内存占用也越大。
    {M: 16, efConstruction: 500} M: [4, 64]

    efConstruction: [8, 512]
    ANNOY n_trees: 影响建立索引的时间和索引大小。值越大,搜索结果越精确,但索引越大。 {n_trees: 8} [1, 1024]

    详细信息请参考 Milvus 索引类型

  2. 为指定集合创建索引:

    # Create an index.
    >>> milvus.create_index('test01', IndexType.IVF_FLAT, ivf_param)
    

删除索引

删除索引后,集合再次使用默认索引类型 FLAT。

>>> milvus.drop_index('test01')

常见问题

建索引参数 nlist 的大小该如何选择? 该值需要根据具体的使用情况去设置。详见 性能调优 > 索引如何设置 Milvus 参数
Milvus 可以在同一个集合中的不同分区上建立不同索引吗? 不可以。同一个集合在某一刻只能有一种索引。
Milvus 中支持新增向量后再建索引吗? 支持。Milvus 中数据是分文件存储的,后续新增向量会存在新的数据文件中。该文件达到一定量后会自动触发建立索引,生成一个新的索引文件,不会影响之前已经建立过的索引。
编辑
© 2019 - 2020 Milvus. All rights reserved.