更新时间:2025-09-05 GMT+08:00
使用GRAPH算法实现向量检索
通过GRAPH算法(深度优化的HNSW实现)在内存优化型集群上实现高召回率、低延迟的向量检索功能,并支持向量与标量字段的联合过滤查询。
应用场景
GRAPH索引算法的向量数据库适用于对查询性能、召回率有较高要求的向量检索场景,例如图像检索、推荐系统、语义搜索等需要高精度相似性匹配的业务。
方案流程
- 向量索引构建:使用GRAPH算法创建向量索引,支持裁边优化、连通性优化和SIMD指令加速。
- 标量字段关联:支持与标量字段(如标签、分类)联合过滤。
- 查询引擎:通过向量相似性计算实现高效检索。
方案优势
- 性能优化:通过裁边优化、连通性优化和SIMD指令加速,相比开源算法提升查询性能和召回率。
- 灵活过滤能力:支持向量与标量字段的联合过滤查询,提升检索精度。
- 高精度匹配:基于HNSW算法的深度优化,实现更优的向量相似性匹配。
约束限制
GRAPH索引需要常驻内存,在内存充足时才能达到最优的查询性能。内存估算请参见内存规划。
前提条件
已创建CSS向量数据库,集群类型是Elasticsearch,集群版本是7.10.2,集群节点规格是“内存优化型”。
操作步骤
- 登录Kibana进入命令执行页面。Elasticsearch集群支持多种客户端访问,本文仅以CSS服务集成的Kibana为例介绍操作步骤。
- 登录云搜索服务管理控制台。
- 在左侧导航栏,选择“集群管理 > Elasticsearch”。
- 在集群列表,选择目标集群,单击操作列的“Kibana”,登录Kibana。
- 在Kibana左侧导航栏选择“Dev Tools”,进入操作页面。
- 创建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" } } } }
- 导入向量数据。
执行以下命令,将全量的向量数据写入新建的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"}
- 写入单条数据:
- 查询向量数据。
执行以下命令,进行向量检索。
- 纯向量相似度查询:
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向量数据库的使用,请参见向量检索特性介绍。
- 了解如何快速上手CSS向量检索功能,请参见使用Elasticsearch实现向量检索。
父主题: Elasticsearch向量检索