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

时间:2017-12-26 10:47:48

标签: solr lucene

让我试着解释一下我的问题,让我们假设我有一个名为"注册"的多值字段。在包含其中学生姓名的每个文档中。

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

我尝试为此添加sort:score desc,但它并没有按照预期的方式工作,因为得分是" 1"对于所有匹配的文件。

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

1 个答案:

答案 0 :(得分:1)

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

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

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

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

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

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

"explain": {
  "VA902B": "\n2.0 = sum of:\n  1.0 = sizes:[23 TO 23]\n  1.0 = sizes:[28 TO 28]\n",
  "3007WFP": "\n1.0 = sum of:\n  1.0 = sizes:[23 TO 23]\n"
},    

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

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

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

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

"explain": {
  "VA902B": "\n4.0 = sum of:\n  2.0 = sum of:\n    1.0 = sizes:[23 TO 23]\n    1.0 = sizes:[28 TO 28]\n  1.0 = sizes:[28 TO 28]\n  1.0 = sizes:[23 TO 23]\n",
  "3007WFP": "\n2.0 = sum of:\n  1.0 = sum of:\n    1.0 = sizes:[23 TO 23]\n  1.0 = sizes:[23 TO 23]\n"
},

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