相关性调优不能靠“把 boost 从 2 改成 5 感觉更好”。先建立带期望结果的离线查询集,再理解 BM25、字段权重和业务信号怎样组合,用指标比较每次变更。
Table of contents
Open Table of contents
BM25 的三个直觉
BM25 通常考虑:词在当前文档中出现得更多,相关性上升;词在全部文档中越少见,区分度越高;较长文档天然包含更多词,需要长度归一化。词频收益会逐渐饱和,不会无限线性增加。
score ≈ IDF(term) × 饱和后的词频 / 文档长度归一化
运行实验室 BM25 测试下载:
mvn -Dtest=SearchArchitectureTest#invertedIndexFindsDocumentsAndFilterDoesNotChangeScore test
标题包含两次 Java 的文档排在只包含一次的文档之前。示例公式与 Lucene 实现不完全等价,但能验证词频、IDF 和长度三个变量。
建立可重复评测
查询集至少包含高频词、长尾词、错别字、类目词、无结果词和敏感查询。每条查询由业务人员标注相关等级,再计算 Precision@K、Recall@K、MRR 或 nDCG。MRR 关注第一个相关结果的位置;nDCG 能处理多级相关性并重视前排。
先调文本:字段选择、分析器、同义词、短语和 minimum_should_match。再加入业务信号,如销量、库存、新鲜度和个性化。业务信号必须限幅或衰减,否则热门商品会永久压住更相关结果。
解释与发布
保存查询模板、索引版本、同义词版本和评测结果。候选方案先离线评测,再用小流量 A/B 测试观察点击、转化、零结果率和延迟;点击率会受位置偏差影响,不能单独代表相关性。
下一步
继续阅读09-06 聚合、桶与分析查询,在搜索结果上构建分类和统计视图。