事情本身不复杂,线索都在日志里。Weaviate 1.25 用 docker 单机部署,collection 里有 12 万条商品说明,hybrid 查询把 alpha 调成 1.0 想只看向量,结果搜「iPhone 15 保护壳」返回的全是颜色描述,关键词完全命中的商品一条都没有,alpha 调回 0.5 才正常,中间换过两次查询词也没用。

第一反应是「查询同时传了 near_text 和 query,服务端优先走向量分支」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。alpha 为 1 时 BM25 分支权重归零,倒排命中的文档直接拿不到分。还有一种是属性没开 indexSearchable,BM25 分支根本读不到该字段的文本。

少数情况下是1.25 默认用 rankedFusion,低分的 BM25 结果被阈值提前过滤。

第一件事是跑一次 alpha 0.5 的对照查询看两路分数

curl -s http://localhost:8080/v1/graphql -H 'Content-Type: application/json' -d '{"query":"{Get{Product(hybrid:{query:\"iPhone 15 保护壳\",alpha:0.5},limit:3){name _additional{score}}}} "}'

再往下把 alpha 设 0 只看关键词确认字段能不能搜

curl -s http://localhost:8080/v1/graphql -H 'Content-Type: application/json' -d '{"query":"{Get{Product(hybrid:{query:\"iPhone 15 保护壳\",alpha:0},limit:3){name}} }"}'

接着查 collection 的 schema 看属性索引开关

curl -s http://localhost:8080/v1/schema/Product | python -m json.tool

补上 indexSearchable 后重建集合并复测

curl -s -X PUT http://localhost:8080/v1/schema/Product -H 'Content-Type: application/json' -d '{"class":"Product","properties":[{"name":"name","dataType":["text"],"indexSearchable":true}]}'

恢复的判定其实很直接。alpha 1.0 时结果里出现关键词完全匹配的商品,_additional.score 里能看到 bm25 分支的贡献,alpha 0 与 1 的排序不再一样。

容易忽略的是,alpha 是两路召回的权重而不是开关,1.0 等于关掉关键词;要纯 BM25 应该把 alpha 设 0 并且只传 query,不要再带 near_text。改动前把原配置备份一份,出问题能马上回滚,这比任何技巧都实用。

作者 9823189