概述
Fess 的 Rank Fusion 功能可以整合多个搜索结果, 提供更精确的搜索结果。
什么是 Rank Fusion
Rank Fusion 是一种将多个搜索算法或评分方法的结果 组合起来,生成单一优化排名的技术。
主要优点:
结合不同算法的优势
提高搜索精度
提供多样化的搜索结果
支持的算法
Fess 支持 RRF(Reciprocal Rank Fusion)算法进行 Rank Fusion。
RRF (Reciprocal Rank Fusion)
RRF 通过对每个搜索结果中文档排名的倒数求和来计算分数。 当一个文档被多个搜索器检索到时,其各项分数会被累加。
计算公式:
k: 调整排名影响程度的常数参数(默认值:20)rank(d): 文档 d 在各搜索结果中的排名(从 0 开始)Σ: 对文档 d 出现的所有搜索器求和
配置
fess_config.properties
基本配置:
| 属性 | 默认值 | 说明 |
|---|---|---|
rank.fusion.window_size | 200 | 从各搜索器中获取用于融合的最大结果数量。必须 >= paging.search.page.max.size × 2``(默认为 ``200);若设定值低于此最小值,将自动提升至该最小值。 |
rank.fusion.rank_constant | 20 | RRF 计算公式中的常数 k。值越大,高排名与低排名结果之间的分数差越小。 |
rank.fusion.threads | -1 | 并行运行多个搜索器时的线程数。指定 0 或以下时,将自动使用 可用 CPU 核心数 × 1.5 + 1。 |
rank.fusion.score_field | rf_score | 用于存储融合后分数的结果文档字段名。 |
JVM 系统属性
使用的搜索器通过 JVM 系统属性指定。 在 fess.in.sh``(或 ``fess.in.bat)中添加如下内容:
此属性的行为如下:
以 JVM 选项形式设置,而非在
fess_config.properties中配置。default是执行标准关键词搜索的搜索器,始终可用。semantic是执行语义搜索(向量搜索)的搜索器,安装 Semantic Search 插件(fess-webapp-semantic-search)后可用。若未指定此属性,将使用所有已注册的搜索器。若指定的名称与任何已注册搜索器均不匹配,则仅使用
default搜索器。结果融合仅在可用搜索器为 2 个或以上时执行。若只有 1 个搜索器可用,则不进行融合,直接返回普通搜索结果。
与混合搜索的集成
Rank Fusion 在结合关键词搜索与语义搜索的 混合搜索中尤为有效。 要使用语义搜索,需安装 Semantic Search 插件(fess-webapp-semantic-search), 并在 -Drank.fusion.searchers 中添加 semantic。
使用示例
基本混合搜索
通过关键词搜索计算 BM25 分数
通过语义搜索计算向量相似度
使用 RRF 融合两种结果
生成最终排名
搜索流程:
性能注意事项
内存使用
由于需要保留多个搜索结果,内存使用量会增加。
可使用
rank.fusion.window_size限制融合目标的最大数量。主搜索器(排在首位的default搜索器)最多获取window_size条结果,其他搜索器各获取window_size ÷ 搜索器数量条结果。
处理时间
由于需要执行多次搜索,响应时间会增加。
使用
rank.fusion.threads设置并行执行的线程数。
故障排除
搜索结果与预期不符
症状:Rank Fusion 后的结果与预期不符
检查事项:
分别确认各搜索类型的结果
调整
rank.fusion.rank_constant的值调整
rank.fusion.window_size的值在翻页较深的页面(
起始位置 × 2大于等于rank.fusion.window_size的位置),不会执行融合,仅使用主搜索器进行搜索。若希望在更多页面上获得融合结果,请增大rank.fusion.window_size。
搜索缓慢
症状:启用 Rank Fusion 时搜索变慢
解决方法:
减小
rank.fusion.window_size:调整
rank.fusion.threads:
内存不足
症状:发生 OutOfMemoryError
解决方法:
减小
rank.fusion.window_size增加 JVM 堆大小