6

検索結果をスコア順に並べたいのですが、スコアが正しく計算されていません。つまり、必ずしも不適切ではありませんが、予想とは異なり、理由はわかりません。私の目標は、スコアを変更しているものをすべて削除することです。

2つのオブジェクト(ObjectAはObjectBよりも高いスコアが期待される)で一致する検索を実行すると、ObjectBが最初に返されます。

この例では、私のクエリが「apples」という単一の用語であるとしましょう。

ObjectAのタイトル:「リンゴはリンゴです」(2/3用語)
ObjectAの説明:「リンゴにはリンゴがありました-リンゴ、そして今やリンゴはすべてのリンゴをリンゴのいたるところに行きました!」(6/18用語)
ObjectBのタイトル:「リンゴは素晴らしい」(1/3用語)
ObjectBの説明:「リンゴの部屋にはリンゴがありましたが、今ではリンゴ全体が悪くなりました!」(4/18用語)

タイトルフィールドにはブーストがなく(つまり、1のブースト)、説明フィールドには0.8のブーストがあります。solrconfig.xmlまたは通過するクエリを介してドキュメントブーストを指定していません。ドキュメントブーストを指定する別の方法がある場合、私がそれを見逃している可能性があります。

プリントアウトを分析した後、 ObjectAObjectBよりも高いスコアを適切に計算しているexplainように見えますが、 1つの違いがあります。ただし、ObjectBのタイトルfieldNormは常にObjectAよりも高くなっています。


以下はexplainプリントアウトです。ご存知のとおり、タイトルフィールドはmditem5_tnsで、説明フィールドはmditem7_tns次のとおりです。

ObjectB:
1.3327172 = (MATCH) sum of:
  1.0352166 = (MATCH) max plus 0.1 times others of:
    0.9766194 = (MATCH) weight(mditem5_tns:appl in 0), product of:
      0.53929156 = queryWeight(mditem5_tns:appl), product of:
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.8109303 = (MATCH) fieldWeight(mditem5_tns:appl in 0), product of:
        1.0 = tf(termFreq(mditem5_tns:appl)=1)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        1.0 = fieldNorm(field=mditem5_tns, doc=0)
    0.58597165 = (MATCH) weight(mditem7_tns:appl^0.8 in 0), product of:
      0.43143326 = queryWeight(mditem7_tns:appl^0.8), product of:
        0.8 = boost
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.3581977 = (MATCH) fieldWeight(mditem7_tns:appl in 0), product of:
        2.0 = tf(termFreq(mditem7_tns:appl)=4)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.375 = fieldNorm(field=mditem7_tns, doc=0)
  0.2975006 = (MATCH) FunctionQuery(1000.0/(1.0*float(top(rord(lastmodified)))+1000.0)), product of:
    0.999001 = 1000.0/(1.0*float(1)+1000.0)
    1.0 = boost
    0.2977981 = queryNorm

ObjectA:
1.2324848 = (MATCH) sum of:
  0.93498427 = (MATCH) max plus 0.1 times others of:
    0.8632177 = (MATCH) weight(mditem5_tns:appl in 0), product of:
      0.53929156 = queryWeight(mditem5_tns:appl), product of:
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.6006513 = (MATCH) fieldWeight(mditem5_tns:appl in 0), product of:
        1.4142135 = tf(termFreq(mditem5_tns:appl)=2)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.625 = fieldNorm(field=mditem5_tns, doc=0)
    0.7176658 = (MATCH) weight(mditem7_tns:appl^0.8 in 0), product of:
      0.43143326 = queryWeight(mditem7_tns:appl^0.8), product of:
        0.8 = boost
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.2977981 = queryNorm
      1.6634457 = (MATCH) fieldWeight(mditem7_tns:appl in 0), product of:
        2.4494898 = tf(termFreq(mditem7_tns:appl)=6)
        1.8109303 = idf(docFreq=3, maxDocs=9)
        0.375 = fieldNorm(field=mditem7_tns, doc=0)
  0.2975006 = (MATCH) FunctionQuery(1000.0/(1.0*float(top(rord(lastmodified)))+1000.0)), product of:
    0.999001 = 1000.0/(1.0*float(1)+1000.0)
    1.0 = boost
    0.2977981 = queryNorm
4

2 に答える 2

6

この問題はステマーが原因で発生します。"apples are apples" を "apples appl are apples appl" に拡張して、フィールドを長くします。ドキュメント B には、ステマーによって展開される用語が 1 つしか含まれていないため、フィールドはドキュメント A よりも短くなります。

これにより、fieldNorm が異なります。

于 2010-06-23T19:08:14.477 に答える
2

FieldNOrm は、フィールドのインデックス時間ブースト、ドキュメントのインデックス時間ブースト、およびフィールド長の 3 つのコンポーネントで計算されます。インデックス時間ブーストを提供していないと仮定すると、違いはフィールド長でなければなりません。

したがって、フィールド値が短いほど lengthNorm が高くなるため、B がタイトルの fieldNorm 値を高くするには、タイトル内のトークンの数が A より少なくなければなりません。

Lucene スコアリングの詳細な説明については、次のページを参照してください。

http://lucene.apache.org/java/2_4_0/scoring.html http://lucene.apache.org/java/2_4_0/api/org/apache/lucene/search/Similarity.html

于 2010-06-23T17:35:13.270 に答える