2009-07-19 5 views
3

Mon index lucene contient des documents avec le champ "itemName". Ce champ est renforcé avec un facteur d'amplification entre 0 et 1. Lorsque je crée un BooleanQuery je voudrais que les résultats sont classés par le nombre de clauses correspondants et la boostfactor, de sorte que la formule ressemble à:Comment implémenter le classement des résultats de recherche personnalisé?

score = (count_of_matching_clauses/count_of_total_clauses + boost_factor)/2 

Le score serait toujours un flottant entre 0 et 1. 1 dans le cas où toutes les clauses correspondent et le facteur de surpuissance est 1.

Par exemple, si la valeur de champ de "itemName" pour trois documents sans facteur d'amplification est:

document1: "java is an island" 
document2: "the secret of monkey island" 
document3: "java island adventures" 

et le Boo leanQuery ressemblerait à ceci:

TermQuery query1 = new TermQuery(new Term("name","java")); 
TermQuery query2 = new TermQuery(new Term("name","island")); 

BooleanQuery query = new BooleanQuery(); 
query.add(query1, BooleanClause.Occur.SHOULD); 
query.add(query2, BooleanClause.Occur.SHOULD); 

que document1 serait récupéré avec un score de (2/2 +0)/2 = 0,5 parce que: count_of_matching_clauses = 2 et count_of_total_clauses = 2

document2 seraient récupéré avec un score de (1/2 + 0)/2 = 0,25 parce que: count_of_matching_clauses = 1 et count_of_total_clauses = 2

que document3 serait récupéré avec un score de (2/2 0)/2 = 0.5 parce que: count_of_match ing_clauses = 2 et count_of_total_clauses = 2

Comment implémenter ce mécanisme de classement dans lucene? Comment puis-je dire à lucene d'utiliser ma classe de classement personnalisée pour classer les résultats?

Répondre

1

Vous pouvez implémenter votre propre algorithme d'évaluation en étendant la classe Similarity et en lui transmettant la recherche. Dans le Javadoc de cette classe (suivez le lien), vous pouvez lire les détails de l'algorithme de notation. Un peu plus de texte sur la notation peut être trouvé here. Une aide exceptionnelle pour comprendre le scoring consiste à voir l'explication de la notation retournée par Searcher.explain()

BTW, la notation que vous souhaitez implémenter est la notation par défaut. L'ordre des résultats sera comme souhaité, bien que les scores réels peuvent être différents de 0,5 ou 0,25.

EDIT: Mise à jour des liens dans la réponse d'origine, qui se rapportait à Lucene v2.4, à v5.3.1.

+0

Non, ce n'est pas la notation par défaut. Il est lié au facteur coord(), mais tf() et idf() peuvent changer non seulement les scores mais aussi l'ordre. Le reste de votre réponse est bien - en particulier la partie explain(). –

+0

Eh bien, votre réponse est bonne, il y a un risque qu'un document obtienne un score plus élevé avec une seule requête en raison du score tf-idf élevé que les autres documents avec les deux requêtes trouvées. Mais, de façon anecdotique, j'ai vu que plus la requête correspond, plus le score est élevé avec DefaultSimilarity. –

+0

Est-ce que changer la classe de similarité change aussi la notation ou seulement les composants de la formule de classement standard? – tommyL

Questions connexes