Desidero offrire ai miei utenti i risultati più pertinenti e migliori. Ad esempio, premo i record che hanno un titolo importante, descrizione, foto allegate, ecc. Per contesto: i record sono percorsi ciclabili, con punti di riferimento (coordinate) e metadati come foto, recensioni, ecc.Come disabilitare il punteggio/boosting predefinito in Hibernate Search/Lucene?
Ora, Ho indicizzato questi record utilizzando Hibernate
e quindi cerco nell'indice utilizzando Lucene
in Hibernate Search
. A segnare i miei risultati, costruisco query basate sulle proprietà del documento e aumentare la loro (utilizzando boostedTo()
) in una should
BooleanJunction clause
:
bj.should(qb.range().onField("descriptionLength").above(3000).createQuery()).boostedTo(3.0f);
bj.should(qb.range().onField("views.views").above(5000).createQuery()).boostedTo(3.0f);
bj.should(qb.range().onField("nameLength").above(20).createQuery()).boostedTo(1.0f);
bj.should(qb.range().onField("picturesLength").above(0).createQuery()).boostedTo(5.0f);
bj.should(qb.keyword().onField("routePoints.poi.participant").matching("true").createQuery()).boostedTo(10.0f);
Per cercare di scoring disabilitazione di Lucene, ho ignorato la classe DefaultSimilarity
, impostare tutte le confrontando al punteggio 1.0f e attivato tramite Hibernate config:
public class IgnoreScoringSimilarity extends DefaultSimilarity {
@Override
public float idf(long docFreq, long numDocs) {
return 1.0f;
}
@Override
public float tf(float freq) {
return 1.0f;
}
@Override
public float coord(int overlap, int maxOverlap) {
return 1.0f;
}
@Override
public float lengthNorm(FieldInvertState state) {
return 1.0f;
}
@Override
public float queryNorm(float sumOfSquaredWeights) {
return 1.0f;
}
}
Hibernate config:
<property name="hibernate.search.default.similarity" value="com.search.IgnoreScoringSimilarity"/>
Questo approccio funziona per il 90% delle volte, tuttavia, sto ancora vedendo alcuni risultati strani che sembrano essere fuori luogo. Lo schema che riconosco è che questi percorsi (documenti) sono di dimensioni molto grandi. Una rotta normale ha circa 20-30 punti di rotta, tuttavia questi risultati fuori dal luogo hanno 100-150. Questo mi lascia credere che il punteggio predefinito di Lucene sia ancora in corso (punteggio più alto a causa delle dimensioni del documento).
Sto facendo qualcosa di sbagliato nel disabilitare i punteggi di Lucene? Potrebbe esserci un'altra spiegazione?
Non una risposta, ma una considerazione: non disattiverei il punteggio predefinito di Lucene, ma lavorerei alla fase di indicizzazione. Costruirei un indicizzatore personalizzato per i tuoi documenti che invece imposta una spinta (ridotta) per i documenti di grandi dimensioni; puoi chiamare 'document.setBoost()' sull'indicizzatore per impostare un valore personalizzato, basato sul numero di punti di riferimento, e controllare i risultati. Qualcosa come 'setBoost (100/routepoints_count)', o qualche funzione esponenziale. –
Grazie per il tuo commento! Ma non darebbe ancora una spinta (seppur piccola) alle dimensioni del documento, calcolando il conteggio delle rotte? Questo è quello che non voglio, perché per il nostro sistema di punteggio, non importa se una rotta ha 2 o 200 punti di riferimento, dovrebbe essere valutata solo dai suoi metadati. – Thermometer
Sì, sarebbe, ma dal momento che stai già aumentando i documenti con grandi fattori, non credo che ciò conterebbe molto. Hai davvero bisogno di indicizzare anche i punti di riferimento? Potresti aggiungere uno snippet del tuo indicizzatore per capire il contenuto dell'indice? –