Solr:得分百分比

时间:2015-04-16 12:27:18

标签: search solr lucene

首先,我已经看到the lucene doc告诉我们不要将得分作为百分比:

  

人们经常想要计算从Lucene得分到“百分比”   确定什么是“100%完美”匹配与“50%”匹配。这是   也有些人称之为“标准化分数”

     

不要这样做。

     

严重。不要试图以这种方式思考你的问题,事实并非如此   好好结束。

由于这些建议,我用另一种方法来解决我的问题。

然而,lucene的论证有几点我不太明白为什么在某些情况下会出现问题。

对于this post的情况,我很容易理解为什么它是坏的:如果用户进行搜索并看到以下结果:

  • 产品A:5星
  • ProductB:2星
  • ProductC:1星

如果ProductA在第一次搜索后被删除,下次用户将来,如果他看到以下结果,他会感到惊讶:

  • 产品B:5星
  • ProductC:3星

所以,这个问题正是Lucene的医生指出的


现在,让我们再举一个例子。

想象一下,我们有一个电子商务网站,它使用'经典搜索'结合拼音搜索。语音搜索是为了避免由于拼写错误导致的最大空值结果。相对于经典搜索的得分,语音结果的得分非常低。

在这种情况下,第一个想法是仅返回至少10%的最高分的结果。即使使用经典搜索,在此阈值下的结果也不会被视为与我们相关。

如果我这样做,我没有上述帖子的问题,因为如果删除文档,如果旧的第二个产品成为第一个产品并且用户不会非常惊讶(这与我将得分保持为浮动值的行为相同)。

此外,如果我们所期望的语音搜索分数非常低,我们将保持相同的行为仅返回相关分数。


所以我的问题是:Lucene建议将得分标准化总是不好的吗?我的例子是一个例外,或者甚至为我的例子做这个也不是一个坏主意吗?

2 个答案:

答案 0 :(得分:3)

正如您所涵盖的,Lucene得分值仅与在匹配中表示相对强度相关。在特定搜索结果集的上下文中,特定记录的得分没有绝对含义

出于这个原因,唯一合适的分数标准化将是对结果集中文档相关性之间的关系进行标准化,即使这样,您也要非常小心如何使用这些信息。

考虑这个结果集,我们检查每条记录的得分与紧接在前的结果相比:

ProductA         (Let's pretend the score is 10)
ProductB:  97%   (9.7)
ProductC:   8.5% (.82)
ProductD: 100%   (.82)
ProductE: 100%   (.82)
ProductF:  24%   (.2)

在这种情况下,前两个结果的得分非常相似,而接下来的三个得分相同,但显着。这些数字显然不能与在线购物者分享,但ProductC和ProductF的低相对分数代表了足够大的下降,您可以使用它们来通知其他显示选项。也许ProductA和ProductB以比其他字体更大的字体显示。如果只有一种产品出现在急剧下降之前,它可能会变得更加特别突出。

我会提醒您不要在此类搜索中完全取消相对较低得分的结果。正如您在示例中已经证明的那样,相对分数可能会产生误导,除非您的相关性得到非常精细的调整,否则最相关的文档可能并不总是最合适。如果由于单个记录恰好重复搜索条件足以赢得一个明星分数而导致所需结果被删除,那将无济于事,这是一个真正的威胁。

  

例如,"Hamilton Beach Three-In-One Convection Toaster Oven"将匹配搜索toaster的八个单词中的一个,而"ToastMaster Toast Toaster Toasting Machine TOASTER"将匹配七个单词中的五个单词,具体取决于您的索引方式。 (两个产品名称都是完全组成的,但我希望第二个产品名称看起来不那么有信誉。)

此外,所有返回的文档都是匹配 ,无论他们的分数有多低。有时,排名较低的结果是用户真正想要的黑马发现。除非您告诉他们,否则用户了解除了他们看到的内容之外还有匹配的文档,因此您可能会隐藏在第2页"或者剪切后面的结尾结果,但是您可能不想阻止他们。让用户了解其结果集的大小也可以帮助他们决定如何微调他们的搜索。使用得分的显着下降作为分页的阈值可能非常有趣,但可能是一个具有挑战性的实现。

答案 1 :(得分:3)

问题是,你如何确定你的截止值,它是什么意思?

可能更容易看一个例子。说我试图通过姓氏寻找人。我要去搜索:

  • "史密斯菲尔德"

我认为以下文件非常匹配:

  • 史密斯菲尔德 - 完全匹配
  • 史密斯菲尔德 - 非常接近,声音相似,只有一个(无声)信件关闭
  • smythfield - 非常接近,声音相似,一个元音改变了
  • 史密斯菲尔特 - 情侣字母关闭,但仍然接近和声音相似
  • snithfield - 不太相似,但只有一封信。也许是一个错字。
  • smittfield - 再说一遍,听起来不太相似,可能是拼写错误或拼写错误
  • smythfelt - 拼写一点点,但可能是一次误导
  • smithfieldings - 相同的前缀

所以,我有四件事需要匹配。应确保完全匹配得分最高,我们需要前缀,模糊和类似声音的匹配。所以我们来搜索:

smithfield smithfield* smithfield~2 metaphone:sm0flt

<强>结果

  • smithfield ::: 2.3430576
  • smithfielde ::: 0.97367656
  • smythfield ::: 0.5657166
  • smithfelt ::: 0.50767094

<强>&LT; 10% - 未显示

  • snithfield ::: 0.2137136
  • smittfield ::: 0.2137136
  • smythfelt ::: 0.0691447
  • smithfieldings ::: 0.041700535

我认为smithfieldings是一个非常好的匹配,但它甚至没有接近削减!它的最大值 2%,没关系10%!好的,让我们尝试提升

smithfield^4 smithfield*^2 smithfield~2 metaphone:sm0flt

<强>结果

  • smithfield ::: 2.8812196
  • smithfielde ::: 0.5907072
  • smythfield ::: 0.30413133

<强>&LT; 10% - 未显示

  • smithfelt ::: 0.2729258
  • snithfield ::: 0.11489322
  • smittfield ::: 0.11489322
  • smithfieldings ::: 0.044836726
  • smythfelt ::: 0.037172448

情况更糟!

在生产中,问题仍然更糟。在现实世界中,您可能正在处理冗长的复杂查询和全文文档。字段长度,匹配重复,协调因素,提升和众多查询字词,所有这些都会影响到分数。

看到第一个结果的分数比第二个结果高出一个数量级并不是那么不寻常,尽管第二个结果仍然是一个有意义的,有趣的结果。没有任何分数均匀分布的保证,所以我们不知道10%的数字意味着什么。 lucene的得分算法往往会使差异变得越来越大而错误。


总是不好吗?我说是的。在我看来,总会有两个更好的选择。

1 - 使用良好的查询控制结果集。如果你很好地构建你的查询,那么 将提供结果的截止,不是因为得分的任意截止,而是因为它根本没有得分。

2 - 如果你不想这样做,你真的通过在任意点切断结果来获得任何收益吗?用户非常擅长识别搜索结果何时离开了深层。用户无法找到他们想要的东西是一个严重的烦恼。显示太多结果通常是没有问题的,只要它们订购得好。