你可以運行你的查詢q=field_name:David
與debugQuery=on
看看會發生什麼。
這些結果(包括通過fl=*,score
分數)由score desc
排序:
<doc>
<float name="score">0.4451987</float>
<str name="id">2</str>
<arr name="text_ws">
<str>David Letterman</str>
</arr>
</doc>
<doc>
<float name="score">0.44072422</float>
<str name="id">3</str>
<arr name="text_ws">
<str>David Hasselhoff</str>
<str>David Michael Hasselhoff</str>
</arr>
</doc>
<doc>
<float name="score">0.314803</float>
<str name="id">1</str>
<arr name="text_ws">
<str>David Bowie</str>
<str>David Robert Jones</str>
<str>Ziggy Stardust</str>
<str>Thin White Duke</str>
</arr>
</doc>
而且這樣的解釋:
<lst name="explain">
<str name="2">
0.4451987 = (MATCH) fieldWeight(text_ws:David in 1), product of: 1.0 = tf(termFreq(text_ws:David)=1) 0.71231794 = idf(docFreq=3, maxDocs=3) 0.625 = fieldNorm(field=text_ws, doc=1)
</str>
<str name="3">
0.44072422 = (MATCH) fieldWeight(text_ws:David in 2), product of: 1.4142135 = tf(termFreq(text_ws:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 0.4375 = fieldNorm(field=text_ws, doc=2)
</str>
<str name="1">
0.314803 = (MATCH) fieldWeight(text_ws:David in 0), product of: 1.4142135 = tf(termFreq(text_ws:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 0.3125 = fieldNorm(field=text_ws, doc=0)
</str>
</lst>
的評分這裏的因素是:
- termFreq:howt連接一個詞出現在文檔中
- IDF:術語出現的頻率在整個指數
- fieldNorm:術語的重要性,這取決於指數時間提高和字段長度
在你的例子fieldNorm
會有所作爲。由於該字段只出現一次,因此您有一個文檔的更低的termFreq
(1而不是1.4142135),但由於字段長度的原因該匹配更重要。
您的字段是多值的事實不會改變評分。我想這與內容相同的單個值域相同。 Solr根據字段長度和術語工作,所以,是的,David Bowie因爲擁有比其他許多令牌而受到懲罰。 :)
UPDATE
其實,我覺得大衛·鮑伊值得他的機會。像上面解釋的那樣,fieldNorm
是有差別的。將屬性omitNorms=true
添加到您的text_ws
字段中的schema.xml
和reindex。同樣的查詢會給你以下結果:
<doc>
<float name="score">1.0073696</float>
<str name="id">1</str>
<arr name="text">
<str>David Bowie</str>
<str>David Robert Jones</str>
<str>Ziggy Stardust</str>
<str>Thin White Duke</str>
</arr>
</doc>
<doc>
<float name="score">1.0073696</float>
<str name="id">3</str>
<arr name="text">
<str>David Hasselhoff</str>
<str>David Michael Hasselhoff</str>
</arr>
</doc>
<doc>
<float name="score">0.71231794</float>
<str name="id">2</str>
<arr name="text">
<str>David Letterman</str>
</arr>
</doc>
正如你可以看到現在的termFreq
勝的fieldNorm
沒有考慮到的。這就是爲什麼包含兩次大衛事件的兩份文件儘管長度各不相同,但仍處於頂端並且得分相同,而只有一場比賽的較短文檔是最後一次得分最低的文檔。下面是與debugQuery=on
的解釋:
<lst name="explain">
<str name="1">
1.0073696 = (MATCH) fieldWeight(text:David in 0), product of: 1.4142135 = tf(termFreq(text:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 1.0 = fieldNorm(field=text, doc=0)
</str>
<str name="3">
1.0073696 = (MATCH) fieldWeight(text:David in 2), product of: 1.4142135 = tf(termFreq(text:David)=2) 0.71231794 = idf(docFreq=3, maxDocs=3) 1.0 = fieldNorm(field=text, doc=2)
</str>
<str name="2">
0.71231794 = (MATCH) fieldWeight(text:David in 1), product of: 1.0 = tf(termFreq(text:David)=1) 0.71231794 = idf(docFreq=3, maxDocs=3) 1.0 = fieldNorm(field=text, doc=1)
</str>
</lst>
感謝您的詳細分類,這正是我需要知道的。有沒有另外一種方法可以將這些數據編入索引,讓這些名稱的評分更「公平」? – user605331 2012-02-13 15:02:46
@ user605331看看我更新的答案,我也給了David Bowie一個機會! – javanna 2012-02-20 19:03:25
省略規範有所幫助,但這不是一個好的解決方案。有人可能需要考慮fieldNorm,但仍然需要使用多值字段。所以我們必須在這兩個之間做出決定:( – 2014-09-18 08:32:03