暂无图片
暂无图片
暂无图片
暂无图片
暂无图片

openGauss 7.0.0-RC2 特性解读 | DiskANN 磁盘索引、 多向量召回、 BM25 全文搜索

openGauss数据库 2025-12-02
66
随着人工智能与大数据的深度融合,向量数据库正在成为构建下一代搜索与推荐系统的核心引擎。如今,我们迎来了向量数据库能力增强的全新升级。向量数据库 DataVec 在社区最新发布的 openGauss 7.0.0-RC2 版本中新增三大特性:DiskANN 磁盘索引、 多向量召回、 BM25 全文搜索。

01


DiskANN:突破内存限制的高效向量检索

传统向量检索往往依赖内存,面对海量数据时容易受限。DiskANN(Disk-based Approximate Nearest Neighbor) 技术的引入,打破了这一瓶颈。DiskANN 索引是一种基于磁盘的向量近似最近邻搜索方案,它主要结合了两项关键技术:
  • 采用 Vamana 算法:Vamana 图索引相比于传统图算法(如 HNSW、NSG),Vamana 通过动态调整参数 α(α≥1)优化图的构建,使其在保持高召回率的同时减少搜索路径长度。可以处理大规模数据,同时保持高召回率、低查询延迟和低内存占用。
  • 采用 PQ 量化算法:通过 PQ 量化编码压缩向量大小,用于快速筛选候选集。 使用示例:
--创建diskann索引
CREATE INDEX ON items USING diskann (embedding vector_l2_ops) WITH (index_size = 100, enable_pq = on, pq_m = 8);
--使用diskann索引进行向量查询
SET diskann_probes = 64;
SELECT * FROM items ORDER BY embedding <-> '[1,2,3,4]';

参考文档 
https://docs.opengauss.org/zh/docs/latest/docs/DataVec/DiskANN.html

02


多向量召回:更高效的搜索体验

在复杂的应用场景中,单一向量往往无法全面表达用户需求。多向量召回特性让向量搜索在并发场景下更加高效。
多向量召回指的是在一个搜索请求中可以同时包含多个查询向量,通过各个语言的连接驱动利用并发连接池并行处理多个查询,从而返回多组结果。相比传统的单向量检索,这种方式不仅能够显著提升查询召回率,也能更好地适应 RAG 等应用场景。
openGauss 提供了 Python、Java、Node.js、Go、C++ 多向量召回接口,开发者可以根据业务场景选择合适的语言驱动来实现并发检索。以 Python 为例:
from psycopg2.extras import execute_multi_search, init_conn_pool, close_conn_pool
sql_template = "SELECT * FROM test_table1 ORDER BY embedding <-> %s LIMIT %s;"
scan_params = {"enable_seqscan""off""hnsw_ef_search" : 40}
dbconfig = {'user''yourusername''password''xxxxxx''host''yourhost''dbname''yourdbname''port' : 5432}
argslist = [('[1,1,1]', 1), ('[2,2,3]', 2)]

conn_pool_mgr = init_conn_pool(dbconfig, 2, scan_params)
res = execute_multi_search(dbconfig, conn_pool_mgr, sql_template, argslist, scan_params, 2)
close_conn_pool(conn_pool_mgr)

这里 res 返回的就是多向量查询的最终结果。
参考文档 
https://docs.opengauss.org/zh/docs/latest/docs/DataVec/integrationPython.html

03


BM25 全文搜索:经典算法驱动精准文本检索

向量检索可以结合 embedding 大模型实现语义匹配,但在某些场景下,关键词搜索依然不可或缺,它可以与向量检索融合使用,从而实现更全面的搜索能力。BM25(Best Matching 25)全文检索算法,通过对文档库构建 BM25 倒排索引,可以快速准确的检索用户提问的相关文档,已成为 RAG 系统的主流选择。
openGauss 新增 BM25 全文检索索引功能,通过简单的创建索引命令,即可为文档库构建 BM25 索引,实现对文档的快速检索,支持新增文档实时更新到索引中。查询响应性能超 GIN 索引几十甚至上百倍。同时,索引数据对接 openGauss 存储引擎,支持主备部署,提供高可用、故障切换、备份恢复的能力,以保障业务连续性。以下为使用示例:
-- 创建普通表,包含id、document列,document存储文本数据
openGauss=# CREATE TABLE bm25_table
(
  id   INT,
  document TEXT
);

CREATE TABLE

-- 插入文档数据
INSERT INTO bm25_table VALUES(1, '香蕉是热带水果');
INSERT INTO bm25_table VALUES(2, '小明喜欢吃香蕉');

-- 为document列建立bm25索引
openGauss=# CREATE INDEX bm25_index on bm25_table using bm25(document);
ALTER TABLE

-- 执行查询语句,检索'香蕉'相关的文档,并显示文档分数
openGauss=# SELECT *+ indexscan (bm25_table bm25_index)*/ *, document <&> '香蕉' AS score FROM bm25_table ORDER BY document <&> '香蕉' DESC;
id  |    document   |   score
1   |  小明喜欢吃香蕉  | .182321563363075
2   |  香蕉是热带水果  | .182321563363075
(2 rows)

-- 使用bm25索引检索'小明喜欢吃什么'
openGauss=# SELECT *+ indexscan (bm25_table bm25_index)*/ *, document <&> '小明喜欢吃什么' AS score FROM bm25_table ORDER BY document <&> '小明喜欢吃什么' DESC;
id  |    document   |   score
1   |  小明喜欢吃香蕉  | 1.3862943649292
(1 rows)

参考文档 
https://docs.opengauss.org/zh/docs/latest/docs/DataVec/BM25%E7%B4%A2%E5%BC%95.html


文章转载自openGauss数据库,如果涉嫌侵权,请发送邮件至:contact@modb.pro进行举报,并提供相关证据,一经查实,墨天轮将立刻删除相关内容。

评论