文档首页/ 云搜索服务 CSS/ 最佳实践/ 向量检索/ 使用GRAPH算法实现向量检索
更新时间:2026-01-09 GMT+08:00
分享

使用GRAPH算法实现向量检索

本文介绍如何通过GRAPH算法在CSS向量数据库中实现高召回率、低延迟的向量检索功能。

应用场景

在大数据处理和搜索场景中,经常需要从大量数据中快速检索出与查询向量最相似的记录,但传统的检索方法往往无法同时满足高召回率和低延迟的要求。通过GRAPH算法(深度优化的HNSW实现)在CSS向量数据库的内存优化型集群上实现高召回率、低延迟的向量检索功能,并支持向量与标量字段的联合过滤查询。适用于图像检索、推荐系统、语义搜索等需要高精度相似性匹配的业务。

方案流程

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

方案优势

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

约束限制

  • GRAPH索引需要常驻内存,在内存充足时才能达到最优的查询性能。内存估算请参见内存规划
  • 该解决方案适用的集群版本:Elasticsearch 7.6.2、Elasticsearch7.10.2、OpenSearch1.3.6、OpenSearch2.19.0。

前提条件

已创建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"
                }
              }
            }
          }
        }
      }

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

相关文档

相关文档