2016-10-25 1 views
2

Je teste opérateur coup de pouce dans Lucene et a trouvé un comportement étrangePourquoi la requête boostée par lucene a un score inférieur à la même requête normale?

Exemple

  1. query1 = "red fox"
  2. query2 = "red^1.2 fox"

Lorsque je teste des requêtes sur le texte:

"merveilleux renard roux"

J'ai reçu un score inférieur à query1 pour query2. Mais je pense que query2 devrait gagner.

Ci-dessous des explications pour les requêtes

expliquiez query1

{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) 
} 

expliquiez 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) 
} 

Je me demande pourquoi la requête a score inférieur a stimulé les d'une normale?

Répondre

1

Ceci est dû à la norme de requête. Cette caractéristique de l'algorithme de notation tente de rendre les scores à peu près comparables d'une requête à l'autre.

Ceci est calculé comme suit:

queryNorm = 1/sumOfSquaredWeights ½

Où:

sumOfSquaredWeights = boost de requête · Σ (FID · terme boost)

Si vous supprimez ce facteur des explications, simplement en divisant le score final par la norme de requête, vous trouvez que la deuxième requête ne, en effet, obtenir un score plus élevé:

  • query1 - > .4339554/2.304384 = 0,1883

  • query2 -> .4313012/2,035813 = 0,2119

Le plus grand point cependant: Vous ne devriez pas trop lire dans la comparaison des scores d'une requête à l'autre. Les scores ne sont vraiment pertinents que pour la requête qui les a générés.Vous pouvez voir dans les explications que le terme boosté contribue un plus grand poids au score, ce qui est tout les boosts sont vraiment destinés à faire.

+0

Alors, comment pourrais-je obtenir le comportement souhaité. J'ai besoin que 'query2' soit un gagnant (le score' query2' devrait être supérieur à 'query1'). J'ai surchargé la méthode 'DefaultSimilarity.QueryNorm' pour toujours retourner' 1.0' pour ignorer la norme de requête. Cela fait-il du sens? – user854301

+1

@ user854301 - Bien sûr, cela désactivera efficacement le queryNorm, mais ce que vous essayez d'accomplir en les comparant est presque certainement une mauvaise idée. Les scores ne sont pas significatifs lorsqu'ils sont sortis du contexte de la requête. Je vous recommande fortement de repenser tout ce que vous essayez de faire. Voir: [Scores as Percentages] (https://wiki.apache.org/lucene-java/ScoresAsPercentages). – femtoRgon