Skip to content

fix: apply payload filters before top-k truncation - #8

Open
Youzini-afk wants to merge 3 commits into
YoKONCy:masterfrom
Youzini-afk:master
Open

fix: apply payload filters before top-k truncation#8
Youzini-afk wants to merge 3 commits into
YoKONCy:masterfrom
Youzini-afk:master

Conversation

@Youzini-afk

@Youzini-afk Youzini-afk commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

背景

修复 #7payload_filter 与较小的 top_k 同时使用时,高分但不匹配过滤条件的节点会先占用 Top-K 名额,导致真正匹配的结果被截断,最终返回空结果或数量不足。

根因是 brute-force 路径将过滤失败的节点映射为 ID 0,而不是从候选集中移除;这些占位结果仍参与排序和 truncate(top_k)

主要改动

  • 新增内部过滤式暴力检索核心,在排序和 Top-K 截断前排除无效候选,同时保持公开 brute_force::search API 不变。
  • 将一致的候选过滤逻辑应用到 brute-force 主召回和 FISTA shadow query,墓碑节点也不再消耗 Top-K 名额。
  • QuIVer 冷向量精排前执行 Payload 过滤;高选择性过滤造成结果不足时,按需回退精确扫描以补足正确结果。
  • 修复 Bloom 预过滤的假阴性边界:
    • 数组、对象和 null 不生成不安全的必需掩码,退化为精确过滤;
    • +0.0-0.0 使用相同规范表示。
  • 明确保护 NodeId 不变量:拒绝墓碑 ID 0 和无可表示后继值的 u64::MAX,并在普通写入、事务预检及 WAL 回放中避免 ID 溢出回绕。
  • 强化并新增 f32、f16、u64、Bloom、非 Bloom、墓碑、FISTA、QuIVer 高选择性和端到端回归测试。
  • 修复本次 PR 暴露的 CI 兼容问题:Rust 1.97 Clippy 新 lint、cargo-llvm-cov report 参数变化,以及 cargo-fuzz workspace/原生主机安装。

兼容性与性能

  • 公开 brute_force::search 函数签名和既有 mapper 调用语义保持不变。
  • 正常能够返回足量结果的 QuIVer 查询仍保持冷路径,不物化全量 merged vectors。
  • 只有设置 Payload 过滤且 QuIVer 过滤后不足 top_k 时,才会触发 O(N) 精确回退。
  • 未改变 TQL SEARCH ... WHERE 和图扩散的既有语义。

验证

  • cargo test --lib --tests
  • cargo test -p triviumdb-cli(71 个单元测试 + 19 个命令测试)
  • cargo clippy --lib --tests -- -D warnings
  • cargo check --workspace
  • cargo check --lib --features python,nodejs
  • cargo test --doc
  • git diff --check

以上均通过。Python/Node 特性检查仅保留一个既有的 Node json_to_filter dead-code warning。

Fixes #7

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

Bug: payload_filtertop_k 交互导致结果被错误丢弃

1 participant