
# 使用GRAPH算法实现向量检索
本文介绍如何通过GRAPH算法在CSS向量数据库中实现高召回率、低延迟的向量检索功能。
#### 应用场景
在大数据处理和搜索场景中，经常需要从大量数据中快速检索出与查询向量最相似的记录，但传统的检索方法无法同时满足高召回率和低延迟的要求。通过GRAPH算法（深度优化的HNSW实现）在CSS向量数据库的内存优化型集群上实现高召回率、低延迟的向量检索功能，并支持向量与标量字段的联合过滤查询。适用于图像检索、推荐系统、语义搜索等需要高精度相似性匹配的业务。
#### 方案流程
1. 向量索引构建：使用GRAPH算法创建向量索引，支持裁边优化、连通性优化和SIMD命令加速。
2. 标量字段关联：支持与标量字段（如标签、分类）联合过滤。
3. 查询引擎：通过向量相似性计算实现高效检索。
 
#### 方案优势
- 性能优化：通过裁边优化、连通性优化和SIMD命令加速，相比开源算法提升查询性能和召回率。
- 灵活过滤能力：支持向量与标量字段的联合过滤查询，提升检索精度。
- 高精度匹配：基于HNSW算法的深度优化，实现更优的向量相似性匹配。
 
#### 约束限制
- GRAPH索引需要常驻内存，在内存充足时才能达到最优的查询性能。内存估算请参见[内存规划](https://support.huaweicloud.com/usermanual-css/css_01_0195.html)。
- 该解决方案适用的集群版本：Elasticsearch 7.6.2、Elasticsearch 7.10.2、OpenSearch 1.3.6、OpenSearch 2.19.0、OpenSearch 3.4.0（镜像版本不低于3.4.0_26.6.0_xxx）。
 
#### 前提条件
已创建CSS向量数据库，本文以Elasticsearch 7.10.2集群为例，集群节点规格是"内存优化型"。
#### 操作步骤
1. 登录Kibana进入命令执行页面。Elasticsearch集群支持多种客户端访问，本文仅以CSS服务集成的Kibana为例介绍操作步骤。 
   1. 登录[云搜索服务管理控制台](https://console.huaweicloud.com/elasticsearch/)。
   
   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"
               }
             }
           }
         }
       }
     }
     ```
     
   
   
   如果成功返回查询结果，则表示检索成功。
   
   
 
#### 相关文档
- 详细了解CSS向量数据库的使用，请参见[向量检索特性介绍](https://support.huaweicloud.com/usermanual-css/css_01_0118.html)。
- 了解如何快速上手CSS向量检索功能，请参见[使用Elasticsearch实现向量检索](https://support.huaweicloud.com/qs-css/css_08_0002.html)。
 
