2015-04-16 24 views
3

首先,我已经看到the lucene doc它告诉我们不要产生比分为百分比:Solr的:成绩为百分比

人们经常要计算“百分比”从Lucene的分数 确定什么是“100%完美”比赛与“50%”比赛。这也是 也被称为“规范化得分”

不要这样做。

说真的。不要试图以这种方式考虑你的问题,这不是 会很好。

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

但是,有几点lucene的论证,我不明白他们为什么在某些情况下有问题。

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

  • 产品A:5星
  • 产品B:2星级
  • ProductC:1星级

如果产品A是他第一次搜索后删除,用户下一次会来,他会感到惊讶,如果他看到了以下结果:

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

所以,这个问题正是Lucene的文档中指出


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

想象我们有使用“经典搜索”拼音搜索结合的电子商务网站。语音搜索在这里是为了避免由于拼写错误而导致的最大数量的空结果。语音结果的得分相对于经典搜索的得分非常低。

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

如果我这样做,我没有问题上述帖子,因为如果一个文件被删除,这似乎合乎逻辑,如果旧的第二个产品成为第一个,用户将不会很惊讶(这是一样的行为,如果我把分数保持为浮点值)。此外,如果语音搜索的分数非常低,正如我们所期望的那样,我们将保持相同的行为以仅返回相关分数。


所以我的问题是:是它总是坏,Lucene的建议正常化成绩?我的例子是一个例外,还是对我的例子来说这是一个坏主意?

回答

3

问题是,你如何确定你的临界值,这是什么意思?

可能更容易看一个例子。假设我正在试图以姓氏寻找人。我要搜索:

  • “史密斯菲尔德”

我有,我认为都是一个不错的比赛下列文件:

  • 史密斯菲尔德 - 精确匹配
  • smithfielde - 非常接近,听起来像,只有一个(无声)信
  • smythfield - 很接近,听起来像,一个元音改变
  • smithfelt - 情侣信件关闭,但仍然关闭和听起来像
  • snithfield - 不完全soundalike,但只有一封信。也许是一个错字。
  • smittfield - 再次,不太雷同的,也许是笔误或拼写错误
  • smythfelt - 拼写一个公平的有点过,但可能是一个mishearing
  • smithfieldings - 同一前缀的

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

smithfield smithfield* smithfield~2 metaphone:sm0flt 

结果

  • 史密斯菲尔德::: 2.3430576
  • smithfielde ::: 0.97367656
  • smythfield ::: 0.5657166
  • smithfelt ::: 0.50767094

< 10% - 不显示

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

我认为smithfieldings是一个非常好的比赛,但它甚至没有接近做出切!这是最少的,而不是10%!好了,所以让我们尝试提高

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

结果

  • 史密斯菲尔德::: 2。8812196
  • smithfielde ::: 0.5907072
  • smythfield ::: 0.30413133

< 10% - 不显示

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

这更惨!

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

虽然第二个结果仍然是一个有意义的,有趣的结果,但看到第一个结果比第二个结果高一个数量级并不奇怪。对分数的均匀分布没有任何保证,所以我们不知道10%的数字意味着什么。而lucene的评分算法往往会让差异变得更好和更大。


它总是不好?我会说是的。正如我所看到的,总是有两个更好的选择。

1 - 用好的查询控制结果集。如果你构建好你的查询,那么将提供你的结果的截止点,而不是因为某些任意截断的分数,而是因为它根本不会得分。

2 - 如果你不想这样做,你是否真的通过切断那个任意点的结果来获得任何东西?用户非常擅长识别搜索结果何时已经结束。用户无法找到他们想要的是一个严重的烦恼。只要他们订购得好,显示太多结果通常都不是问题。

+0

感谢您的回答和您的解释。我对你在第2节中关于用户所说的话有所了解并理解,但对于诸如方面之类的东西,我认为用户可能会迷路。 我们举一个例子,我使用低音提升语音。在法语中,我们有“议程”这个词,意思是“日记”。当用户搜索'议程'时,语音会给出像'savon'这样的结果,这意味着'soap',因为它包含术语'agents nettoyants'(这意味着'更清洁')。 所以,我的第一个方面之一将是'肥皂',尽管我的搜索是'日记'!?即使是最聪明的用户也会想知道会发生什么?! – alexf

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页”或隐藏后面隐藏尾部结果,但您可能不想阻止它们。让用户理解其结果集的大小也可以帮助他们决定如何微调他们的搜索。使用分数的显着下降作为分页的阈值可能是非常有趣的,但可能是一个具有挑战性的实现。

+0

感谢您的回答。你给的建议很好,但要做很多工作。为了解决我的例子,我终于使用一个新的使用语音的requestHandler,只有当“基本搜索”返回0结果而不是使用阈值。 – alexf