查询重排序
查询重排序允许你运行一个简单的查询 (A) 来匹配文档,然后使用更复杂的查询 (B) 的分数对前 N 个文档进行重排序。
由于查询 B 中代价更高的排序仅应用于前 N 个文档,因此与单独使用复杂查询 B 相比,它对性能的影响较小。缺点是,即使使用查询 B 时得分很高,使用简单查询 A 得分非常低的文档也可能在重排序阶段不被考虑。
指定排名查询
可以使用 rq
请求参数指定排名查询。rq
参数必须指定一个查询字符串,该字符串在解析时会生成一个 RankQuery。
Solr 发行版中目前包含三个排名查询。你还可以配置你编写的自定义 QParserPlugin,但大多数用户可以直接使用 Solr 提供的解析器。
解析器 | QParserPlugin 类 |
---|---|
rerank |
|
xport |
|
ltr |
LTRQParserPlugin |
ReRank 查询解析器
rerank
解析器包装由本地参数指定的查询,以及指示应重排序多少文档以及应如何计算最终分数的其他参数
reRankQuery
-
必需
默认值:无
复杂排名查询的查询字符串 - 在大多数情况下,一个变量将用于引用另一个请求参数。
reRankDocs
-
可选
默认值:
200
应重排序的原始查询中前 N 个文档的数量。此数字将被视为最小值,并且可能会在内部自动增加,以便对足够多的文档进行排名以满足查询(即,start+rows)。
reRankWeight
-
可选
默认值:
2.0
一个乘法因子,它将应用于每个匹配的顶部文档的 reRankQuery 的分数,然后该分数将与原始分数合并。
reRankScale
-
可选
默认值:
none
在最小值和最大值之间缩放重排分数。此参数值的格式为
min-max
,其中 min 和 max 是正整数。例如reRankScale=0-1
将重排分数重新缩放到 0 到 1 之间。 reRankMainScale
-
可选
默认值:
none
在最小值和最大值之间缩放主查询分数。此参数值的格式为
min-max
,其中 min 和 max 是正整数。例如reRankMainScale=0-1
将主查询分数重新缩放到 0 到 1 之间。 reRankOperator
-
可选
默认值:
add
默认情况下,reRankQuery 的分数乘以
reRankWeight
将添加到原始分数。
在下面的示例中使用默认的 add
行为,匹配查询“greetings”的前 1000 个文档将使用查询“(hi hello hey hiya)”进行重排序。这 1000 个文档中的每一个的最终分数将是它们从“(hi hello hey hiya)”中获得的分数的三倍,加上来自原始“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
代表 Learning To Rank(学习排序),请参阅 学习排序 获取更详细的信息。