2012-02-13 6 views
16

Solrで多値フィールドを持つドキュメントを複数持っている場合は、独立してスコア付けするか、連結して1つの大きなフィールドとしてスコア付けしますか?私は彼らが独立して得点をつけたいと思っています。ここに私が意味するものの例があります:solr多値フィールドの得点

人の名前のフィールドがあり、同じ人物の名前が複数ある場合があります。名前はすべて異なっています(場合によっては非常に異なります)が、すべて同じ人物/文書です。

人1: デヴィッド・ボウイ、デビッド・ロバート・ジョーンズ、ジギースターダスト、シン・ホワイト・デューク

人2: デビッドレター

人3: デヴィッド・ハッセルホフ、デヴィッド・マイケル・ハッセルホフ

の場合私は "David"を検索することになりました。これらのすべてに同じことが起こる可能性があります。それぞれの名前が独立してスコアリングされている場合は、そうであるように見えます。それらがただ一つのフィールドとして保存され、検索された場合、David Bowieは他のものよりも多くのトークンを持つことで処罰されるでしょう。 Solrはこのシナリオをどのように扱いますか?

答えて

18

クエリq=field_name:DaviddebugQuery=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.xmltext_wsフィールドに属性omitNorms=trueを追加し、インデックスを再作成します。あなたは今termFreqfieldNormが全く考慮されていないと見ることができるように

<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> 
+0

詳細な内訳をいただきありがとうございます。これらの名前をより公平にスコアリングするために、このデータにインデックスを付ける代わりの方法はありますか? – user605331

+1

@ user605331私の更新された答えを見て、私はデビッドボウイにも機会を与えた! – javanna

+1

規範を省略すると役立ちますが、良い解決策ではありません。 fieldNormを考慮に入れたいが、多値フィールドを使用する必要があるかもしれない。だから私たちはこれら2つの間で決める必要があります:( –

3

あなたはすべて1.0のノルムを持つべき長さの高原を定義するためにLucenes SweetSpotSimilarityを使用することができます。これは、あなたの名前などのようなものを探している限り、あなたの状況であなたを助けることができますlengthNormは何もしません。

+0

これは有望ですが、それは特定のフィールドではなく、IndexWriterレベルで設定されているので、 (おそらく伝記か、ここの例にあてはまるもの)、SweetSpotSimilarityも同様に使う必要がありますよね? – user605331

関連する問題