2017-09-29 5 views
0

Comment modifier la fonction de notation de Solr pour donner moins de poids à la "fréquence de terme"? J'utilise un boost de document de type pagerank comme facteur de pertinence. Mon index de recherche met actuellement beaucoup de documents qui sont "spammy" ou pas bien nettoyés et ont des mots répétitifs sur le dessus.Donner moins de poids à la fréquence du terme dans solr?

Je sais que le score est calculé par la fréquence des termes (fréquence de recherche dans le document), la fréquence des documents inverses et d'autres (How are documents scored?). Je pourrais juste augmenter le coup de pouce, mais cela déséquilibrerait également les autres facteurs.

Est-ce le chemin à parcourir pour spécifier une fonction au moment de la requête (et quelle est la fonction par défaut), ou dois-je changer la configuration et réindexer? J'utilise django-haystack avec solr, si ça fait une différence.

Répondre

1

Je ne suis pas sûr que ce soit la meilleure façon de le faire, mais cela semble fonctionner. Je crée une sous-classe de Similarity en Java. Dans ClassicSimilarity, la fréquence de terme est définie comme sqrt(freq). Cela n'a aucun sens d'ajouter un facteur multiplicatif, puisque tf est multiplié avec d'autres termes, non ajoutés - le facteur d'échelle serait simplement appliqué uniformément. C'est à dire. scale * a * b n'a pas de sens, scale * a + b serait. Mais ce que vous pouvez faire dans ce cas est a^scale * b. Ce que cela fait essentiellement est qu'il applique un facteur d'échelle dans le logarithme: log(score) = scale * log(a) + log(b).

Notez également que la fonction de similarité par défaut ne semble pas être TF-IDF après tout, mais BM25. Ceci est une variation de TF-IDF.

package com.example.solr; 
import org.apache.lucene.search.similarities.ClassicSimilarity; 

public class CustomSimilarity extends ClassicSimilarity { 
    @Override 
    public float tf(float freq) { 
     return (float) Math.pow(freq, 0.25); // default: 0.5 
    } 

    @Override 
    public String toString() { 
     return "CustomSimularity"; 
    } 
} 

compiler avec:

javac -cp /path/to/solr-6.6.1/server/solr-webapp/webapp/WEB-INF/lib/lucene-core-6.6.1.jar:. -d . CustomSimilarity.java 
jar -cvf myscorer.jar com 

Ensuite, ajoutez à solrconfig.xml:

<lib path="/path/to/myscorer.jar" /> 

et schema.xml:

<similarity class="com.example.solr.CustomSimilarity"> 
</similarity> 

Après avoir redémarré solr, vous pouvez Veri fy que la nouvelle classe de similarité est utilisée sous http://localhost:8983/solr/#/<corename>/schema.

+1

La similarité par défaut est passée à BM25 avec la sortie de Solr6. Vous pouvez également définir la classe de similarité _per field_ now, de sorte que vous pouvez avoir un champ avec un calcul différent des autres champs. – MatsLindh

+0

Merci pour l'information! Pour la postériorité, voici un lien instructif sur la différence entre TD-IDF et BM25 dans Lucene: http://opensourceconnections.com/blog/2015/10/16/bm25-the-next-generation-of-lucene-relevation/ – jdm