更新时间:2024-11-29 GMT+08:00

IVF_GRAPH和IVF_GRAPH_PQ算法使用

操作场景

在向量索引加速算法中,IVF_GRAPH和IVF_GRAPH_PQ适用于超大规模场景。这两种算法需要通过对子空间的切割缩小查询范围,子空间的划分通常采用聚类或者随机采样的方式。该步骤需要客户完成聚类或者随机采样的生成子空间中心点向量的工作。

当完成生成中心点向量的工作之后,需要对中心点向量进行预构建和注册,以实现将中心点向量预构建GRAPH或者GRAPH_PQ索引,同时注册到Elasticsearch集群内,实现在多个节点间共享此索引文件。中心点索引在shard间复用能够有效减少训练的开销、中心点索引查询次数,提升写入以及查询的性能。

操作步骤

  1. 创建中心点索引表。

    例如,创建的索引命名为my_dict,该索引的“number_of_shards”数必须设置为“1”,否则无法注册。

    当需要使用IVF_GRAPH索引时,中心点索引的“algorithm”参数值设置为“GRAPH”

    当需要使用IVF_GRAPH_PQ索引时,中心点索引的“algorithm”参数值设置为“GRAPH_PQ”

    PUT my_dict 
     { 
       "settings": { 
         "index": { 
           "vector": true 
         }, 
         "number_of_shards": 1, 
         "number_of_replicas": 0 
       }, 
       "mappings": { 
         "properties": { 
           "my_vector": { 
             "type": "vector", 
             "dimension": 2, 
             "indexing": true, 
             "algorithm": "GRAPH", 
             "metric": "euclidean" 
           } 
         } 
       } 
     } 

  2. 写入中心点向量数据。参考导入向量将采样或者聚类得到的中心点向量写入上述创建的my_dict索引中。
  3. 调用注册接口。

    将上述创建的my_dict索引注册具有全局唯一标识名称(dict_name)的Dict对象。

    PUT _vector/register/my_dict?timout=120s
     {
      "dict_name": "my_dict"
     }

    为了防止词典较大造成注册超时,“timeout”默认为10分钟,可以适当进行调整。

  4. 创建IVF_GRAPH或IVF_GRAPH_PQ索引。

    在创建IVF_GRAPH或者IVF_GRAPH_PQ索引时,不需指定“dimension”以及“metric”信息,只需指定已注册完成的Dict名称即可。

    PUT my_index 
     { 
       "settings": { 
         "index": { 
           "vector": true 
         } 
       }, 
       "mappings": { 
         "properties": { 
           "my_vector": { 
             "type": "vector", 
             "indexing": true, 
             "algorithm": "IVF_GRAPH", 
             "dict_name": "my_dict", 
             "offload_ivf": false 
           } 
         } 
       } 
     }
    表1 Field mappings参数

    参数

    说明

    dict_name

    指定依赖的中心点索引名称。该索引字段的向量维度和度量方式将与dict索引保持一致,不再需要额外指定。

    offload_ivf

    将底层索引实现的IVF倒排索引卸载到Elasticsearch端实现,可以减少堆外内存的使用,以及减少写入或合并的性能开销,但是查询的性能也有一定的损失。一般采用默认值即可。

    • 取值范围:true、false
    • 默认值:false