Solr:先按短语排序,然后按日期排序
Solr: sort by phrase slop first then by date
我有一个 Solr (6.2) DisMax Select 查询,它使用 pf(短语字段)和 ps(短语溢出)。
pf = text^2.2 title^2.2, ps = 2
;
我希望我的查询 return 结果遵循此算法:
- 如果查询词组完全匹配,return它们在前,按日期排序
- 如果有文档至少包含查询短语中的一个词,return其次,按日期排序
示例数据: 文本(last_modified 括号中的时间戳)
- 关于重要人物的事情 (2018)
- 重要人物:文章(2019)
- 有些人认为这很重要 (2020)
- 重要新闻(2015)
- 十年来的人物(2020 年)
想要的结果:
首先可以接受斜率的短语
- 有些人认为这很重要 (2020)
- 重要人物:文章(2019)
- 关于重要人物的事情 (2018)
那么至少有一个词
- 十年来的人物(2020 年)
- 重要新闻(2015)
我试过的:
- 将查询用双引号括起来并使用
qs
(查询短语斜率),这样它可以按预期工作,但会忽略 "at least on of the words" 部分;
- 使用像
last_modified:[NOW/DAY-3MONTH TO NOW/DAY]^20.0
; 这样的 bq(提升查询)
- 使用像
recip(ms(NOW,last_modified),3.16e-11,1,1)
; 这样的 bf(提升函数)
- 显式
last_modified desc
排序 - 但它完全忽略了分数
- 使用多重排序
score desc, last_modified desc
- 但只有当第一个排序出现平局时,第二种排序才有效(而且几乎从来没有平局)
我已经通过使用获得了(几乎)想要的结果:
增强函数 (bf) = recip(ms(NOW,last_modified),3.16e-11,1,1)^1500
(不得不使用一个巨大的提升数字来冒泡最近的
结果);
查询字段 qf = 'text^4 title^2'
;
短语字段 pf = 'text^5 title^2'
;
短语斜率ps = 4;
查询短语 Slop qs = 2;
最小应匹配 mm = len(split('\s', query)) + 1
(前代码)
按空格拆分查询,用 OR 连接确切的短语和每个单独的单词,并将最小应匹配参数 (mm) 设置为 len(split)+1 因此,例如,查询 "apple dog" 转换为"apple dog" or apple or dog
。双引号是 qs 参数工作所必需的,并强制结果与确切的短语一起冒泡。
也许我正在使用的方法有一些调整,欢迎任何评论。
我有一个 Solr (6.2) DisMax Select 查询,它使用 pf(短语字段)和 ps(短语溢出)。
pf = text^2.2 title^2.2, ps = 2
;
我希望我的查询 return 结果遵循此算法:
- 如果查询词组完全匹配,return它们在前,按日期排序
- 如果有文档至少包含查询短语中的一个词,return其次,按日期排序
示例数据: 文本(last_modified 括号中的时间戳)
- 关于重要人物的事情 (2018)
- 重要人物:文章(2019)
- 有些人认为这很重要 (2020)
- 重要新闻(2015)
- 十年来的人物(2020 年)
想要的结果:
首先可以接受斜率的短语
- 有些人认为这很重要 (2020)
- 重要人物:文章(2019)
- 关于重要人物的事情 (2018)
那么至少有一个词
- 十年来的人物(2020 年)
- 重要新闻(2015)
我试过的:
- 将查询用双引号括起来并使用
qs
(查询短语斜率),这样它可以按预期工作,但会忽略 "at least on of the words" 部分; - 使用像
last_modified:[NOW/DAY-3MONTH TO NOW/DAY]^20.0
; 这样的 bq(提升查询)
- 使用像
recip(ms(NOW,last_modified),3.16e-11,1,1)
; 这样的 bf(提升函数)
- 显式
last_modified desc
排序 - 但它完全忽略了分数 - 使用多重排序
score desc, last_modified desc
- 但只有当第一个排序出现平局时,第二种排序才有效(而且几乎从来没有平局)
我已经通过使用获得了(几乎)想要的结果:
增强函数 (bf) =
recip(ms(NOW,last_modified),3.16e-11,1,1)^1500
(不得不使用一个巨大的提升数字来冒泡最近的 结果);查询字段 qf =
'text^4 title^2'
;短语字段 pf =
'text^5 title^2'
;短语斜率ps = 4;
查询短语 Slop qs = 2;
最小应匹配 mm =
len(split('\s', query)) + 1
(前代码)
按空格拆分查询,用 OR 连接确切的短语和每个单独的单词,并将最小应匹配参数 (mm) 设置为 len(split)+1 因此,例如,查询 "apple dog" 转换为"apple dog" or apple or dog
。双引号是 qs 参数工作所必需的,并强制结果与确切的短语一起冒泡。
也许我正在使用的方法有一些调整,欢迎任何评论。