查询重新排序
查询重新排序允许您对匹配的文档运行简单查询 (A),然后使用更复杂查询 (B) 中的分数对前 N 个文档重新排序。
由于查询 B 中更昂贵的排序仅应用于前 N 个文档,因此与仅使用复杂查询 B 本身相比,它对性能的影响较小。权衡之处在于,即使使用查询 B 得分很高,使用简单查询 A 得分很低的文档在重新排序阶段也可能不会被考虑。
指定排序查询
可以使用 rq
请求参数指定排序查询。rq
参数必须指定一个查询字符串,当对其进行解析时,会生成一个 RankQuery。
Solr 分发中当前包含三个排序查询。您还可以配置您编写的自定义 QParserPlugin,但大多数用户只需使用 Solr 提供的解析器即可。
解析器 | QParserPlugin 类 |
---|---|
rerank |
|
xport |
|
ltr |
LTRQParserPlugin |
重新排序查询解析器
rerank
解析器包装由本地参数指定的一个查询,以及其他参数,指示应重新排序多少个文档,以及应如何计算最终分数
reRankQuery
-
必需
默认值:无
用于复杂排名查询的查询字符串 - 在大多数情况下,变量将被用于引用其他请求参数。
reRankDocs
-
可选
默认值:
200
从原始查询中应重新排名的前 N 个文档的数量。此数字将被视为最小值,并且可能会在内部自动增加,以便对足够的文档进行排名以满足查询(即 start+rows)。
reRankWeight
-
可选
默认值:
2.0
乘法因子,在将分数与原始分数合并之前,将应用于每个匹配度最高的文档的 reRankQuery 中的分数。
reRankScale
-
可选
默认值:
无
在最小值和最大值之间缩放重新排序分数。此参数值的格式为
min-max
,其中 min 和 max 为正整数。例如,reRankScale=0-1
将重新排序分数重新缩放为 0 到 1 之间。 reRankMainScale
-
可选
默认值:
无
在最小值和最大值之间缩放主查询分数。此参数值的格式为
min-max
,其中 min 和 max 为正整数。例如,reRankMainScale=0-1
将主查询分数重新缩放为 0 到 1 之间。 reRankOperator
-
可选
默认值:
add
默认情况下,reRankQuery 中的分数乘以
reRankWeight
会添加到原始分数中。
在下面使用默认 add
行为的示例中,将使用查询 “(hi hello hey hiya)” 重新对匹配查询 “greetings” 的前 1000 个文档进行排名。这 1000 个文档中每个文档的结果分数将是其来自 “(hi hello hey hiya)” 的分数的 3 倍,加上来自原始 “greetings” 查询的分数
q=greetings&rq={!rerank reRankQuery=$rqq reRankDocs=1000 reRankWeight=3}&rqq=(hi+hello+hey+hiya)
如果某个文档匹配原始查询,但不匹配重新排序查询,则该文档的原始分数将保持不变。
将 reRankOperator
设置为 multiply
将改为将这三个数字相乘。这意味着其他乘法运算,例如 eDisMax boost
函数 可以转换为重新排序运算。
在下面的示例中,匹配查询 “phone” 的前 1000 个文档的分数将乘以 price
字段的函数。
q=phone&rq={!rerank reRankQuery=$rqq reRankDocs=1000 reRankWeight=1 reRankOperator=multiply}&rqq={!func v=div(1,sum(1,price))}
将 reRankOperator
设置为 replace
将替换分数,因此最终分数可以独立于文档的原始分数。
在下面的示例中,匹配查询 “phone” 的前 1000 个文档的分数将替换为 price
字段的函数。
q=phone&rq={!rerank reRankQuery=$rqq reRankDocs=1000 reRankWeight=1 reRankOperator=replace}&rqq={!func v=div(1,sum(1,price))}
LTR 查询解析器
ltr
代表学习排名,有关更多详细信息,请参见 学习排名。