solrのスコア計算
solr(Lucene)のスコア計算を改めて調べました。
こちらが詳しく書かれています。
score(q, d) =
coord(overlap, maxOverlap).
queryNorm(q).
Σ(tf(t in d). idf(t)^2. norm(t, d))
t in q
というのが計算式です。
solrのリクエスト時にdebugQuery=onで実行して、こちらと見比べてみます。
テストデータをインポートして、”solr ipod”で検索、4件ヒットします。
例)
http://localhost:8983/solr/select/?q=solr+ipod&version=2.2&start=0&rows=10&indent=on&debugQuery=on
そのうち、1件目のスコア情報を見てみると、下記のような感じです。
0.2925402 = (MATCH) product of:・・・(1)
0.5850804 = (MATCH) sum of:・・・(2)
0.5850804 = (MATCH) weight(text:ipod in 3), product of:・・・(3)
0.6273345 = queryWeight(text:ipod), product of:・・・(4)
2.871802 = idf(docFreq=3, numDocs=26)・・・(5)
0.21844627 = queryNorm・・・(6)
0.9326451 = (MATCH) fieldWeight(text:ipod in 3), product of:・・・(7)
1.7320508 = tf(termFreq(text:ipod)=3)・・・(8)
2.871802 = idf(docFreq=3, numDocs=26)・・・(9)
0.1875 = fieldNorm(field=text, doc=3)・・・(10)
0.5 = coord(1/2)・・・(11)
こちらと、計算式を見比べてみます。
0.2925402 = (MATCH) product of:・・・(1)↑最終的なスコアです。(2)×(11)になっています。
0.5850804 = (MATCH) sum of:・・・(2)↑検索文字列中ipodしかヒットしていないので(3)と同じですが、複数ヒットした場合はその合計値になります。
0.5850804 = (MATCH) weight(text:ipod in 3), product of:・・・(3)↑ipodで検索した場合の重みです。(4)×(7)になっています。
0.6273345 = queryWeight(text:ipod), product of:・・・(4)↑ipodで検索した場合のクエリー部分の重みです。(5)×(6)になっています。
2.871802 = idf(docFreq=3, numDocs=26)・・・(5)↑計算式中のidf部分です。(26ドキュメント中3ドキュメントヒットしている)
0.21844627 = queryNorm・・・(6)↑計算式中のqueryNorm部分です。
0.9326451 = (MATCH) fieldWeight(text:ipod in 3), product of:・・・(7)↑ipodで検索した場合のフィールド部分の重みです。(8)×(9)×(10)になっています。
1.7320508 = tf(termFreq(text:ipod)=3)・・・(8)↑計算式中のtf部分です。(フィールド中にipodという文字列が3つ存在する)
2.871802 = idf(docFreq=3, numDocs=26)・・・(9)↑計算式中のidf部分です。(これで2乗分)
0.1875 = fieldNorm(field=text, doc=3)・・・(10)↑計算式中のnorm部分です。(フィールド長より計算)
0.5 = coord(1/2)・・・(11)↑計算式中のcoord部分です。
大雑把にいうと、
・クエリーの単語がより多く含まれている。
・検索対象フィールドの文章が短い。
・希少単語が含まれる。
という時にスコアが高くなるという傾向になります。
Posted in Lucene |
