概述
Fess 的 Rank Fusion 功能可以整合多个搜索结果, 提供更精确的搜索结果。
什么是 Rank Fusion
Rank Fusion 是一种将多个搜索算法或评分方法的结果 组合起来,生成单一优化排名的技术。
主要优点:
结合不同算法的优势
提高搜索精度
提供多样化的搜索结果
支持的算法
Fess 支持以下 Rank Fusion 算法:
| 算法 | 说明 |
|---|---|
| RRF (Reciprocal Rank Fusion) | 使用排名倒数的融合算法 |
| Score Fusion | 通过分数归一化和加权平均进行融合 |
| Borda Count | 基于投票的排名融合 |
RRF (Reciprocal Rank Fusion)
RRF 通过对每个结果排名的倒数求和来计算分数。
计算公式:
score(d) = Σ 1 / (k + rank(d))
k: 常数参数(默认: 60)rank(d): 文档 d 在各搜索结果中的排名
配置
fess_config.properties
基本配置:
# 启用 Rank Fusion
rank.fusion.enabled=true
# 使用的算法
rank.fusion.algorithm=rrf
# RRF 的 k 参数
rank.fusion.rrf.k=60
# 融合对象的搜索类型
rank.fusion.search.types=keyword,semantic
按算法配置
RRF 配置:
rank.fusion.algorithm=rrf
rank.fusion.rrf.k=60
Score Fusion 配置:
rank.fusion.algorithm=score
rank.fusion.score.normalize=true
rank.fusion.score.weights=0.7,0.3
Borda Count 配置:
rank.fusion.algorithm=borda
rank.fusion.borda.top_n=100
与混合搜索的集成
Rank Fusion 在结合关键词搜索和语义搜索的 混合搜索中特别有效。
配置示例
# 启用混合搜索
search.hybrid.enabled=true
# 融合关键词搜索和语义搜索的结果
rank.fusion.enabled=true
rank.fusion.algorithm=rrf
rank.fusion.rrf.k=60
# 各搜索类型的权重
search.hybrid.keyword.weight=0.6
search.hybrid.semantic.weight=0.4
使用示例
基本混合搜索
通过关键词搜索计算 BM25 分数
通过语义搜索计算向量相似度
使用 RRF 融合两种结果
生成最终排名
搜索流程:
User Query
↓
┌──────────────────┬──────────────────┐
│ Keyword Search │ Semantic Search │
│ (BM25) │ (Vector) │
└────────┬─────────┴────────┬─────────┘
↓ ↓
Rank List 1 Rank List 2
└────────┬─────────┘
↓
Rank Fusion (RRF)
↓
Final Ranking
自定义评分
组合多个评分因素的示例:
# 基本搜索分数 + 日期提升 + 热门度
rank.fusion.enabled=true
rank.fusion.algorithm=score
rank.fusion.score.factors=relevance,recency,popularity
rank.fusion.score.weights=0.5,0.3,0.2
性能注意事项
内存使用
由于保留多个搜索结果,内存使用量会增加
使用
rank.fusion.max.results限制融合对象的最大数量
# 融合对象的最大结果数
rank.fusion.max.results=1000
处理时间
由于执行多个搜索,响应时间会增加
考虑通过并行执行进行优化
# 启用并行执行
rank.fusion.parallel=true
rank.fusion.thread.pool.size=4
缓存
对频繁的查询使用缓存
# Rank Fusion 结果缓存
rank.fusion.cache.enabled=true
rank.fusion.cache.size=1000
rank.fusion.cache.expire=300
故障排除
搜索结果与预期不符
症状: Rank Fusion 后的结果与预期不符
检查事项:
分别确认各搜索类型的结果
确认权重是否适当
调整 k 参数值
搜索缓慢
症状: 启用 Rank Fusion 时搜索变慢
解决方法:
启用并行执行:
rank.fusion.parallel=true
限制融合对象的结果数:
rank.fusion.max.results=500
启用缓存:
rank.fusion.cache.enabled=true
内存不足
症状: 发生 OutOfMemoryError
解决方法:
减少融合对象的最大结果数
增加 JVM 堆大小
禁用不需要的搜索类型