Domanda

Voglio che i miei risultati di ricerca per ordine di punteggio, che stanno facendo, ma il punteggio viene calcolato in modo non corretto. Questo per dire che, non necessariamente impropriamente , ma in modo diverso del previsto e non sono sicuro perché. Il mio obiettivo è quello di rimuovere tutto ciò che sta cambiando il punteggio.

Se effettuo una ricerca che partite su due oggetti (dove si prevede Objecta di avere un punteggio superiore a ObjectB), ObjectB viene restituito prima.

esempio di Let, per questo esempio, che la mia domanda è un singolo termine:. "Mele"

  

titolo del Objecta: "Le mele sono le mele" (2/3 termini)
  Descrizione Objecta: "C'erano mele nelle mele-mele e ora le mele è andato tutte le mele in tutto le mele!" (6/18 termini)
  Titolo del ObjectB: "le mele sono grandi" (1/3 termini)
  Descrizione ObjectB: "C'erano mele in mele camera ed ora le mele è andato tutto male in tutto le mele!" (4/18 termini)

Il campo titolo non ha alcun boost (o meglio, una spinta di 1) e il campo descrizione ha una spinta di 0,8. Non ho specificato una spinta documento tramite solrconfig.xml o tramite la query che sto passando. Se c'è un altro modo per specificare una spinta del documento, c'è la possibilità che mi manca uno.

Dopo aver analizzato la stampa explain, sembra Objecta è calcolare correttamente un punteggio superiore a ObjectB, proprio come voglio, ad eccezione di una differenza: di ObjectB titolo fieldNorm è sempre superiore Objecta di.


Di seguito la stampa explain. Solo così si sa: il campo titolo è mditem5_tns e il campo descrizione è 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
È stato utile?

Soluzione

Il problema è causato dal Stemmer. Si espande "mele sono mele" a "mele appl sono mele appl" rendendo così il campo più lungo. Come documento B contiene solo 1 termine che viene ampliata con l'Stemmer i soggiorni più brevi di campo allora documento A.

Questo si traduce in diverse fieldNorms.

Altri suggerimenti

FieldNOrm viene calcolato da 3 componenti - spinta indice di tempo sul campo, indice di tempo spinta sulla lunghezza del documento e del campo. Supponendo che non stanno fornendo alcuna spinta index-tempo, la differenza deve essere lunghezza del campo.

In questo modo, dal momento che lengthNorm è più elevata per i valori di campo più brevi, per B per avere un valore più elevato fieldNorm per il titolo, deve avere più piccolo numero di gettoni nel titolo di A.

Si vedano le pagine seguenti per una spiegazione dettagliata di Lucene punteggio:

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

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top