文档首页/ 云搜索服务 CSS/ 最佳实践/ Elasticsearch向量检索/ 使用IVF_GRAPH_PQ算法实现向量检索
更新时间:2025-09-05 GMT+08:00

使用IVF_GRAPH_PQ算法实现向量检索

CSS向量数据库通过预构建共享中心点索引(GRAPH_PQ)并关联IVF_GRAPH_PQ算法类型的向量索引,实现对百亿级向量的高性能、低成本检索。

应用场景

IVF_GRAPH_PQ是组合索引算法,核心组件包括:

  • IVF(Inverted File):通过聚类生成中心点向量,将数据划分子空间(Centroid)。构建图索引(Graph)加速子空间选择,提升查询效率。
  • PQ(Product Quantization):对向量进行量化压缩,降低存储和计算开销。
  • 共享中心点机制:多个分片/段共享同一组中心点,减少重复聚类开销。

IVF_GRAPH_PQ索引算法的向量数据库适用于数据总量超过百亿、每日新增写入超1亿的海量数据场景,例如图像识别、推荐系统、自然语言处理等需要向量相似性检索的业务。

方案流程

  1. 通过聚类或采样生成中心点向量,构建GRAPH_PQ中心点索引。
  2. 关联中心点索引表,使用IVF_GRAPH_PQ算法创建向量索引。
  3. 写入向量数据。
  4. 通过向量相似性计算实现高效检索。

方案优势

  • 共享中心点:索引跨分片/分段全局共享中心点向量,减少重复聚类开销。
  • 图索引加速:通过图结构优化子空间选择效率,提升性能。
  • PQ量化降本:降低索引存储和查询计算开销。
  • 资源优化:索引无需常驻内存,节省集群资源成本。

前提条件

  • 已创建CSS向量数据库,集群类型是Elasticsearch,集群版本是7.10.2,集群节点规格是“内存优化型”
  • 已通过聚类或随机采样获取中心点向量数据(数量为总数据量的千分之一~万分之一)。

操作步骤

  1. 登录Kibana进入命令执行页面。Elasticsearch集群支持多种客户端访问,本文仅以CSS服务集成的Kibana为例介绍操作步骤。

    1. 登录云搜索服务管理控制台
    2. 在左侧导航栏,选择“集群管理 > Elasticsearch”
    3. 在集群列表,选择目标集群,单击操作列的“Kibana”,登录Kibana。
    4. 在Kibana左侧导航栏选择“Dev Tools”,进入操作页面。

  2. 创建中心点索引表。

    执行如下命令,创建中心点索引表,例如“my_dict”

    其中,索引分片数“number_of_shards”必须配置为“1”,向量索引的算法类型“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": 4, 
            "indexing": true, 
            "algorithm": "GRAPH_PQ", 
            "metric": "euclidean" 
          } 
        } 
      } 
    }

  3. 导入中心点向量。

    执行以下命令,将采样或者聚类得到的中心点向量写入新建的中心点索引表中。

    • 写入单条数据:
      POST my_dict/_doc
      {
        "my_vector": [1.0, 1.0, 1.0, 1.0]
      }
    • 批量写入多条数据:
      POST my_dict/_bulk
      {"index": {}}
      {"my_vector": [2.0, 2.0, 2.0, 2.0]}
      {"index": {}}
      {"my_vector": [3.0, 3.0, 3.0, 3.0]}
      {"index": {}}
      {"my_vector": [4.0, 4.0, 4.0, 4.0]}

  4. 注册中心点索引表。

    执行以下命令,将中心点索引表注册为具有全局唯一标识名称(dict_name)的Dict对象,“dict_name”可以自定义。

    PUT _vector/register/my_dict 
    { 
      "dict_name": "my_dict" 
    }

  5. 创建IVF_GRAPH_PQ索引。

    执行以下命令,创建IVF_GRAPH_PQ算法类型的向量索引(例如“my_index”),通过向量字段里的“dict_name”关联上一步注册的中心点索引表。

    PUT my_index 
    { 
      "settings": { 
        "index": { 
          "vector": true,
          "sort.field": "my_vector.centroid"  # 将向量字段的centroid子字段设置为排序字段
        } 
      }, 
      "mappings": { 
        "properties": { 
          "my_vector": { 
            "type": "vector", 
            "indexing": true, 
            "algorithm": "IVF_GRAPH_PQ", 
            "dict_name": "my_dict", 
            "offload_ivf": true 
          } 
        } 
      } 
    }

  6. 导入全量向量数据。

    执行以下命令,将全量的向量数据写入新建的IVF_GRAPH_PQ索引。

    • 写入单条数据:
      POST my_index/_doc
      {
        "my_vector": [2.0, 3.0, 4.0, 5.0]
      }
    • 批量写入多条数据:
      POST my_index/_bulk
      {"index": {}}
      {"my_vector": [2.0, 3.0, 4.0, 5.0]}
      {"index": {}}
      {"my_vector": [1.0, 2.0, 3.0, 4.0]}
      {"index": {}}
      {"my_vector": [3.0, 4.0, 5.0, 6.0]}

  7. 查询向量数据。

    执行以下命令,进行向量检索:

    POST my_index/_search
    {
      "size":2,
      "query": {
        "vector": {
          "my_vector": {
            "vector": [1.0, 1.0, 1.0, 1.0],
            "topk":2
          }
        }
      }
    }

    如果成功返回最相似的2条结果,则表示检索成功。

相关文档