事情本身不复杂,线索都在日志里。给检索加上 category 条件后,结果直接变成空列表,去掉过滤就能查到大量内容。
第一反应是「过滤语法用了别的数据库的写法」,验证下来不成立。
真正麻烦的地方在于,几个原因的现象几乎一样。字段名与入库时的元数据键不一致。另一种情况是值的类型不匹配,数字被当成字符串比较。
少数情况下是入库时该字段根本没有写入。
第一件事是确认元数据里实际有哪些键
python -c "print(client.query('docs', limit=3, output_fields=['category']))"
接着按正确语法构造过滤表达式
hits = client.search(data, 'embedding', filter='category == "tech"', limit=5)
去掉过滤做对照,确认向量本身没问题
python -c "print(len(base_hits))"
剩下的就是在入库侧统一字段名与类型
python ingest.py --check-schema
恢复的判定其实很直接。带过滤的检索能返回预期条数,结果都满足条件,去掉过滤时结果数量更多。
这里还有个坑。过滤是在检索之后还是之前执行,不同实现差别很大,候选集太小时先过滤再检索才不会把结果滤光。线上能稳定复现的问题都不算难,难的是只在大流量下才出现的那种。