让我试着解释一下我的问题,让我们假设我有一个名为"注册"的多值字段。在包含其中学生姓名的每个文档中。
现在在搜索Solr时,让我说我搜索三名学生的名字 - Manish,Amit,Navin。现在Solr返回包含这些名称中的任何一个的所有文档(在我的情况下显然是需要的)。现在一些文件可能包含全部3个,或者其中2个或其中1个。我希望这些文档/结果按顺序排序,使得具有最大匹配的文档将位于顶部,然后是较少数量的匹配。
我尝试为此添加sort:score desc,但它并没有按照预期的方式工作,因为得分是" 1"对于所有匹配的文件。
如何通过多值字段的最大匹配数来实现排序顺序?
答案 0 :(得分:1)
给定一个多值整数字段,您希望根据匹配数对文档进行排名,为每个匹配应用一个提升查询。例如,如果你有一系列不同大小的显示器,你可以为每个有效的大小应用一个提升(我将它一起攻击并使用来自技术核心的示例文档进行测试,这就是我的例子和我坚持下去。我有两个相关文档,一个名为VA902B
,sizes
作为多值字段,值为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
查询,行为是相同的。