Solr - 按多值字段上的OR搜索的最大匹配对结果进行排序

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Solr - 按多值字段上的OR搜索的最大匹配对结果进行排序相关的知识,希望对你有一定的参考价值。

让我试着解释我的问题,让我们假设我在每个文档中都有一个名为“enrollment”的多值字段,其中包含学生的名字。

现在在搜索Solr的时候,让我说我搜索了三个学生的名字 - Manish,Amit,Navin。现在Solr返回包含这些名称中的任何一个的所有文档(在我的情况下显然是需要的)。现在一些文件可能包含全部3个,或者其中2个或其中1个。我希望这些文档/结果按顺序排序,使得具有最大匹配的文档将位于顶部,然后是较少数量的匹配。

我尝试为此添加sort:score desc,但它无法正常工作,因为所有匹配文档的得分均为“1”。

如何通过我的多值字段的最大匹配数来实现排序顺序?

答案

给定一个多值整数字段,您希望根据匹配数对文档进行排名,为每个匹配应用一个提升查询。例如,如果你有一系列不同大小的显示器,你可以为每个有效的大小应用一个提升(我将它一起攻击并使用来自技术核心的示例文档进行测试,这就是我的例子和我坚持下去。我有两个相关的文件,一个名为VA902Bsizes作为多值字段给出,值为23,28和32,一个名为3007WFP,值为23,29,36,在同一个字段中。

在这里我要求任何文件,但是给我那些尺寸为28和23的顶部,然后是那些尺寸为28或尺寸为23,然后是任何其他文件的文件:

?bq=sizes:28&bq=sizes:23&defType=edismax&q=*:*

如果我想将文档集限制为只匹配任何大小的文档,我可以将其用作我的主要查询:

?defType=edismax&q=sizes:(23%2028)

..而且我发现你无论比赛次数多少,你的分数是相同的假设都是假的。将&debugQuery=true添加到URL为我们提供了每个文档的详细评分信息:

"explain": {
  "VA902B": "
2.0 = sum of:
  1.0 = sizes:[23 TO 23]
  1.0 = sizes:[28 TO 28]
",
  "3007WFP": "
1.0 = sum of:
  1.0 = sizes:[23 TO 23]
"
},    

..这意味着不需要应用提升 - 您想要的行为是Solr的标准行为。这是我最初的想法,但是应该通过您在评论中提供的查询给出正确答案。

但是我会告诉你我应用提升的策略是如何运作的:

?bq=sizes:28&bq=sizes:23&defType=edismax&q=sizes:(23%2028)&debugQuery=true

..现在告诉我们每个文档的分数实际上已经翻了一倍,因为每次匹配得分为1.0(来自查询)+ 1.0(来自提升)。

"explain": {
  "VA902B": "
4.0 = sum of:
  2.0 = sum of:
    1.0 = sizes:[23 TO 23]
    1.0 = sizes:[28 TO 28]
  1.0 = sizes:[28 TO 28]
  1.0 = sizes:[23 TO 23]
",
  "3007WFP": "
2.0 = sum of:
  1.0 = sum of:
    1.0 = sizes:[23 TO 23]
  1.0 = sizes:[23 TO 23]
"
},

我还使用标准的lucene查询解析器测试了q=sizes(23 28)查询(而不是支持bq的dismax / edismax),行为是相同的。

以上是关于Solr - 按多值字段上的OR搜索的最大匹配对结果进行排序的主要内容,如果未能解决你的问题,请参考以下文章

将 Solr 重复值删除到多值字段中

在 Solr 中对多值字段进行排序

Pandas 数据框:如何按多值列将一行拆分为多行? [复制]

Spring data solr 总是创建多值字段

SQL按多值字符串列中的不同值分组

solr 通过配置多值字段动态字段来解决文本表达式查询精确到句子的问题