2015-04-16 28 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