Question

Je veux que mes résultats de la recherche à l'ordre par résultat, qu'ils font, mais le score est calculé de manière incorrecte. C'est-à-dire pas nécessairement mal , mais différemment que prévu et je ne sais pas pourquoi. Mon but est de supprimer tout ce qui est en train de changer le score.

Si j'effectue une recherche correspondant sur deux objets (où ObjectA est prévu d'avoir un score plus élevé que ObjectB), ObjectB sont renvoyés en premier.

Le mot Let, pour cet exemple, que ma requête est un seul terme. « Pommes »

  

le titre de ObjectA: "les pommes sont des pommes" (2/3 termes)
  Description de ObjectA: « Il y avait des pommes dans les pommes-pommes et maintenant les pommes a toutes les pommes partout dans les pommes! » (6/18 termes)
  Titre de ObjectB: « les pommes sont grandes » (1/3 termes)
  Description de ObjectB: « Il y avait des pommes dans les pommes à manger et maintenant les pommes a tout mauvais partout dans les pommes! » (4/18 termes)

Le champ de titre n'a pas d'impulsion (ou plutôt, une impulsion de 1) et le champ de description a une impulsion de 0,8. Je n'ai pas spécifié un coup de pouce de documents par solrconfig.xml ou par la requête que je passe à travers. S'il y a un autre moyen de spécifier un coup de pouce de documents, il y a la chance que je manque un.

Après avoir analysé l'impression de explain, il ressemble ObjectA calculer correctement un score supérieur à ObjectB, tout comme je veux, sauf pour un différence: le fieldNorm titre de ObjectB est toujours de plus que ObjectA.


suit ici l'impression de explain. Juste pour que vous le savez: le champ titre est mditem5_tns et le champ de description est 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
Était-ce utile?

La solution

Le problème est causé par l'égrappoir. Il se développe « les pommes sont des pommes » à « pommes Appl sont des pommes appl » rendant ainsi le champ plus. Comme document B contient seulement 1 terme qui est en cours d'extension par l'égrappoir les séjours sur le terrain plus court alors le document A.

Il en résulte différents fieldNorms.

Autres conseils

FieldNOrm est calculée de 3 composants - boost à temps index sur le terrain, coup de pouce à temps index sur le document et la longueur de champ. En supposant que vous ne fournissez aucune augmentation de l'indice temps, la différence doit être la longueur du champ.

Ainsi, étant donné que lengthNorm est plus élevé pour les valeurs de champ plus courtes, pour B d'avoir une valeur supérieure fieldNorm pour le titre, il doit avoir plus petit nombre de jetons dans le titre que A.

Voir les pages suivantes pour une explication détaillée de la notation 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

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top