Manticore Search 中 KNN 预过滤:ACORN-1 优化 HNSW
Manticore Search 19.0.1+ 版本中的 KNN 预过滤功能,将属性过滤器直接集成到 HNSW 图遍历过程中。这消除了后过滤的低效问题,后过滤需要先扫描整个数据集,再应用过滤条件。在一个包含 1000 万商品的产品目录中,使用 '电子产品' 类别过滤(仅占 5% 文档),后过滤可能返回少于请求的 k 个结果,浪费资源处理无关节点。
预过滤在候选探索过程中检查条件,确保精确返回 k 个匹配文档的结果。
后过滤的问题与转向预过滤
在后过滤中,HNSW 忽略过滤条件:算法先找到全局 k 个最近邻向量,然后丢弃不匹配项。对于严格过滤(如 category='电子产品' AND price<500),图遍历会探索大量无关区域,导致召回率下降和延迟增加。
带自动预过滤的示例 SQL 查询:
SELECT id, title, knn_dist()
FROM products
WHERE knn(embedding, (0.12, 0.45, 0.78, 0.33))
AND category = '电子产品'
AND price < 500
LIMIT 10;
JSON 等价形式:
{
"table": "products",
"knn": {
"field": "embedding",
"query": [0.12, 0.45, 0.78, 0.33]
},
"query": {
"bool": {
"must": [
{ "equals": { "category": "电子产品" } },
{ "range": { "price": { "lt": 500 } } }
]
}
},
"limit": 10
}
类别和价格过滤会在 HNSW 遍历过程中检查。
朴素预过滤:原理与局限
朴素方法按常规遍历 HNSW,但仅将通过过滤的节点加入优先队列。不匹配节点仍用于导航以保持图连通性。
局限:无论过滤与否,都会计算所有邻居距离。在 5% 选择性下,95% 的计算(最耗时操作)被浪费。
Manticore 中的 ACORN-1:高级优化
Manticore 为选择性过滤器(<60% 文档)实现 ACORN-1:
- 距离计算前过滤:邻居在计算距离前先过滤。不匹配项直接跳过,无需评估。
- 自适应扩展:从不匹配节点出发,算法探索其邻居(最多 3–4 层),专注寻找合适候选。
在低选择性下,这可减少 95% 距离计算,提升搜索速度而不损失质量。
高选择性时,ACORN-1 自动激活。
自动执行策略选择
Manticore 规划器使用属性直方图评估选择性:
- 标准 HNSW:>60% 文档通过过滤 — 朴素预过滤。
- ACORN-1:1–60% — 优化遍历。
- 全扫描:<1%(如 1000 万中 50 个)— 直接扫描过滤文档,绕过 HNSW。
它比较预期 HNSW 访问节点数与过滤子集大小。
管理过滤模式
后过滤(prefilter=0 或 "prefilter": false):
SELECT id, knn_dist()
FROM products
WHERE knn(embedding, (0.12, 0.45, 0.78, 0.33), { prefilter=0 })
AND category = '电子产品'
LIMIT 10;
全扫描(fullscan=1 或 "fullscan": true):
SELECT id, knn_dist()
FROM products
WHERE knn(embedding, (0.12, 0.45, 0.78, 0.33), { fullscan=1 })
AND category = '电子产品'
LIMIT 10;
后过滤适合需要全局最近邻或 >95% 文档通过的情况。全扫描适用于极小过滤集。
| 模式 | 选择性 | 优势 | 劣势 |
|------|--------|------|------|
| 后过滤 | 高 (>95%) | 简单、可预测 | 结果少于 k 个 |
| 预过滤 (朴素) | 中等 (60–95%) | 可靠 k 个结果 | 开销 |
| ACORN-1 | 低 (1–60%) | 计算节省 | 实现复杂 |
| 全扫描 | 极低 (<1%) | 精确召回 | 线性复杂度 |
关键要点
- KNN+属性默认使用预过滤,保证 k 个结果。
- ACORN-1 在 <60% 选择性下节省高达 95% 距离计算。
- 超选择性过滤自动全扫描。
- 后过滤用于全局排序或调试。
- 规划器基于直方图按查询/段自适应。
— Editorial Team
暂无评论。