2016-10-25 11 views
2

は私が"red fox" lucene boostedクエリーが同じ通常のクエリーよりもスコアが低いのはなぜですか?

  • QUERY2 = =

    1. Query1という奇妙な行動をLuceneのでブースト演算子をテストしたんだ"red^1.2 fox"私はテキストに対してクエリをテスト

    「すてきな赤い狐」

    私はquery1よりもquery2のスコアが低いです。しかし、私はquery2が勝つはずだと思います。

    クエリの説明以下

    {0,4339554 = (MATCH) sum of: 
        0,2169777 = (MATCH) weight(content:fox in 0), product of: 
        0,7071068 = queryWeight(content:fox), product of: 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         2,304384 = queryNorm 
        0,3068528 = (MATCH) fieldWeight(content:fox in 0), product of: 
         1 = tf(termFreq(content:fox)=1) 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         1 = fieldNorm(field=content, doc=0) 
        0,2169777 = (MATCH) weight(content:red in 0), product of: 
        0,7071068 = queryWeight(content:red), product of: 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         2,304384 = queryNorm 
        0,3068528 = (MATCH) fieldWeight(content:red in 0), product of: 
         1 = tf(termFreq(content:red)=1) 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         1 = fieldNorm(field=content, doc=0) 
    } 
    

    Query1をのために説明クエリは、通常のものよりも低いスコアを持って後押しなぜかしらQUERY2ため

    {0,4313012 = (MATCH) sum of: 
        0,2396118 = (MATCH) weight(content:fox^1.25 in 0), product of: 
        0,7808688 = queryWeight(content:fox^1.25), product of: 
         1,25 = boost 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         2,035813 = queryNorm 
        0,3068528 = (MATCH) fieldWeight(content:fox in 0), product of: 
         1 = tf(termFreq(content:fox)=1) 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         1 = fieldNorm(field=content, doc=0) 
        0,1916894 = (MATCH) weight(content:red in 0), product of: 
        0,6246951 = queryWeight(content:red), product of: 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         2,035813 = queryNorm 
        0,3068528 = (MATCH) fieldWeight(content:red in 0), product of: 
         1 = tf(termFreq(content:red)=1) 
         0,3068528 = idf(docFreq=1, maxDocs=1) 
         1 = fieldNorm(field=content, doc=0) 
    } 
    

    を説明しますか?

  • 答えて

    1

    これは、クエリの基準によるものです。スコアリングアルゴリズムのこの特徴は、スコアをおおよそと比較することを試行します。

    これは次のように計算される:Σ(IDF・ターム・

    sumOfSquaredWeights =クエリブースト:

    queryNorm = 1/sumOfSquaredWeights

    ブースト)

    あなたは、単にクエリノルムによって最終的なスコアを分割することにより、説明からその要因を削除する場合は、2番目のクエリがないことが判明、実際に、より高いスコアを取得:

    • Query1をします - > .4339554/2.304384 = 0.1883

    • QUERY2 - > 0.4313012/2.035813 = 0.2119

    しかし、大きなポイント:1つのクエリから次のクエリまでのスコアを比較するのはあまり読んではいけません。スコアは、それらを生成したクエリに本当に関連します。説明では、ブーストされた用語がスコアに重みが大きい,という重みを与えることが分かります。これはすべてのブーストが実際に行うことを意図しています。

    +0

    私はどのようにして希望の行動を起こすことができますか?私は 'query2'が勝者(' query2'スコアは 'query1'よりも高くなければなりません)である必要があります。 'DefaultSimilarity.QueryNorm'メソッドをオーバーライドして、常にクエリのノルムを無視するために' 1.0'を返しました。それは意味を作っていますか? – user854301

    +1

    @ user854301 - 確かに、それは効果的にqueryNormを無効にしますが、あなたがそれらを比較して達成しようとしていることは、ほぼ確実に悪い考えです。スコアはクエリのコンテキストから取り除かれても意味がありません。私は強くあなたが何をしようとしているのか考え直すことをお勧めします。参照:[スコアとしてのスコア](https://wiki.apache.org/lucene-java/ScoresAsPercentages)。 – femtoRgon

    関連する問題