更新时间:2025-09-05 GMT+08:00

使用GRAPH算法实现向量检索

通过GRAPH算法(深度优化的HNSW实现)在内存优化型集群上实现高召回率、低延迟的向量检索功能,并支持向量与标量字段的联合过滤查询。

应用场景

GRAPH索引算法的向量数据库适用于对查询性能、召回率有较高要求的向量检索场景,例如图像检索、推荐系统、语义搜索等需要高精度相似性匹配的业务。

方案流程

  1. 向量索引构建:使用GRAPH算法创建向量索引,支持裁边优化、连通性优化和SIMD指令加速。
  2. 标量字段关联:支持与标量字段(如标签、分类)联合过滤。
  3. 查询引擎:通过向量相似性计算实现高效检索。

方案优势

  • 性能优化:通过裁边优化、连通性优化和SIMD指令加速,相比开源算法提升查询性能和召回率。
  • 灵活过滤能力:支持向量与标量字段的联合过滤查询,提升检索精度。
  • 高精度匹配:基于HNSW算法的深度优化,实现更优的向量相似性匹配。

约束限制

GRAPH索引需要常驻内存,在内存充足时才能达到最优的查询性能。内存估算请参见内存规划

前提条件

已创建CSS向量数据库,集群类型是Elasticsearch,集群版本是7.10.2,集群节点规格是“内存优化型”

操作步骤

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

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

  2. 创建GRAPH算法类型的向量索引。

    创建一个名为“my_index”的索引,该索引包含一个名为“my_vector”的向量字段和一个标签字段“my_label”。

    PUT my_index 
    {
      "settings": {
        "index": {
          "vector": true
        }
      },
      "mappings": {
        "properties": {
          "my_vector": {
            "type": "vector",
            "dimension": 2,
            "indexing": true,
            "algorithm": "GRAPH",
            "metric": "euclidean"
          },
          "my_label": {
            "type": "keyword"
          }
        }
      }
    }

  3. 导入向量数据。

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

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

  4. 查询向量数据。

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

    • 纯向量相似度查询:
      POST my_index/_search
      {
        "size":3,
        "_source": {"excludes": ["my_vector"]}, 
        "query": {
          "vector": {
            "my_vector": {
              "vector": [1, 1],
              "topk":3
            }
          }
        }
      }
    • 向量+标量联合查询(前置过滤查询):
      POST my_index/_search
      {
        "size":3,
        "_source": {"excludes": ["my_vector"]}, 
        "query": {
          "vector": {
            "my_vector": {
              "vector": [1, 1],
              "topk":3,
              "filter": {
                "term": {
                  "my_label": "red"
                }
              }
            }
          }
        }
      }

    如果成功返回查询结果,则表示检索成功。

相关文档