学习笔记 · Obsidian
数据库内向量检索与高级过滤
结论
- Neo4j、Oracle、PostgreSQL、Redis、SAP HANA、YDB 把向量能力放进现有数据库/数据平台,能复用权限、事务或业务字段;代价是数据库版本、扩展、索引与连接池调优更复杂。
- filter DSL 都不同,tenant/ACL 条件必须由服务端生成或合并;任何表名、列名、Cypher/SQL 片段都不能直接来自用户。
- HNSW/IVF 等 ANN 索引提高速度但降低或改变召回;应先用 exact baseline,再按真实查询调参。
PGVectorStore
现代 PGVectorStore 使用 @langchain/pgvector、pg 和 pgvector extension,官方建议新项目优先它而不是 legacy PGVector。页面有一处说明把 JavaScript 推荐包写成 @langchain/community,与同页安装/类表的 @langchain/pgvector 矛盾;应以安装示例、API reference 和当前 npm 包核对,不能照抄该句。
initialize()检查/创建表;表名与列名不可包含用户输入,否则有 SQL injection。- 支持 ID、delete、exact filter、
in、notIn、arrayContains、Retriever。 - 可复用
pg.Pool;至少先运行一次 initialize 建表。 - 默认 sequential scan 有 100% recall;
createHnswIndex()支持 dimensions、m、efConstruction、distanceFunction,维度上限页面标为 2000。 - 完成后调用
end()或关闭共享 pool。
Redis
Redis 8 起 RediSearch 内置;@langchain/redis 同时提供:
FluentRedisVectorStore:新项目推荐,强类型Tag、Num、Text、Geo、Timestamp、Customfilter,array-based custom schema;RedisVectorStore:legacy,object-based schema 和较基础过滤。
Fluent 版本要求显式 customSchema,文档推断只用于差异警告。GEO 使用 longitude/latitude,timestamp 存数值;metadata 拆成独立字段,与 legacy JSON blob index 不兼容。迁移应新建 index 并重新摄取,不能直接指向旧 index。
预过滤在 vector 计算前执行,可减少比较量;但 raw Custom RediSearch syntax 必须受控。连接结束调用 disconnect()。
SAP HANA
HanaDB 支持 external embedding 与数据库内 VECTOR_EMBEDDING();内部 embedding 和 rerank 要求启用 NLP。功能最完整:
- cosine(默认)或 L2;HNSW 默认
m=64、efConstruction=128、efSearch=200; - filter 支持比较、集合、between、like、contains、and/or;
- MMR、metadata filter、
CROSS_ENCODErerank、独立HanaReranker; - 标准表三列 text/metadata/vector,也可映射 custom table;
- 高频 filter metadata 可复制到专用列,提高过滤性能。
useMapMerge 只允许内部 embedding。custom table 的附加列插入时必须允许 NULL;specificMetadataColumns 的 schema/类型需要 migration 管理。
OracleVS
OracleVS 把 text、JSON metadata 与 vector 保存在 Oracle,支持 rich filter、HNSW(默认)和 IVF。可接受连接或已有 pool;应用应复用 pool 而不是每次建连接。
- filter 操作符包括 eq/ne/lt/lte/gt/gte/in/nin/between/exists 与 and/or;
- HNSW 适合 recall/latency 平衡,IVF 用聚类分区换可预测内存;
- index 建议在批量加载后创建,重建/切换通过受控 DDL;
- 文档概述提到 Oracle 26ai hybrid/full-text,但当前页面示例主要覆盖写入、filter 和 index,实际启用需核对数据库版本与 Oracle 文档。
Neo4j 与 YDB
Neo4jVectorStore支持 vector、Euclidean/cosine、hybrid、existing graph、customretrievalQuery和 metadata filter。连接账户要最小权限,优先只读;动态 Cypher 可能破坏或泄露图数据。YDBVectorStore利用分布式 SQL 的一致性与 ACID;ID 缺失时生成 UUID,同 ID 重插覆盖,支持删除、score 与 AND metadata filter。await using可自动关闭 driver,不使用时必须手动close()。
生产设计
- DDL/索引创建与在线查询账户分离;应用运行账户不得任意建表/删索引。
- exact 与 ANN 在同一评估集对比 recall 和 p99;索引参数变化作为版本发布。
- filter 高频字段建立原生列/索引;记录选择性并防止低选择性全扫。
- 数据库 pool 设置上限、获取超时、statement timeout 和健康检查;长批量写采用 checkpoint。
- 备份必须同时覆盖正文、metadata、embedding model/version 与 index 重建配置。