クエリq=field_name:David
をdebugQuery=on
と実行するだけで、何が起こるかを確認できます。
これらはscore desc
によってソート結果(fl=*,score
てスコアを含む)は次のとおりです。
<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.4142135ではなく1)という低い文書が1つありますが、その長さがフィールド長のために重要です。
フィールドがmultiValuedであるという事実は、スコアリングを変更しません。同じ内容の単一の値フィールドでは同じになると思います。 Solrはフィールドの長さと用語の面で機能するので、David Bowieは他のトークンよりも多くのトークンを持っているために処罰されます。 :)
UPDATE
私は実際にはデヴィッド・ボウイが彼の機会に値すると思います。上記のように、fieldNorm
が違いを生みます。 schema.xml
のtext_ws
フィールドに属性omitNorms=true
を追加し、インデックスを再作成します。あなたは今termFreq
勝fieldNorm
が全く考慮されていないと見ることができるように
<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>
:同じクエリはあなたに次のような結果が得られます。だからこそ、2つのデイヴィッドの出現を持つ2つの文書は、その長さが異なっていても、同じスコアでトップにあり、1つだけ一致する短い文書は、スコアが最も低い最後の文書です。ここで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
@ user605331私の更新された答えを見て、私はデビッドボウイにも機会を与えた! – javanna
規範を省略すると役立ちますが、良い解決策ではありません。 fieldNormを考慮に入れたいが、多値フィールドを使用する必要があるかもしれない。だから私たちはこれら2つの間で決める必要があります:( –