2011-04-29 2 views
3

J'utilise la fonction rord() dans les requêtes Solr afin d'améliorer les résultats de la requête sur un champ « rang », en utilisant un quelque chose de syntaxe comme ceci:Qu'est-ce qu'une stratégie recommandée pour remplacer les requêtes de fonction ord() et rord() dans Solr?

bf=rord(cur_rank)^1.8 

L'algorithme fonctionne bien, mais les récents changements dans Solr indiquent qu'utiliser ord() et rord() est un cochon de mémoire maintenant. De the changelog:

recherche et le tri se fait maintenant sur une base par segment, ce qui signifie que les entrées FieldCache utilisées pour le tri et pour les requêtes de fonction sont créés et utilisés par segments et peuvent être réutilisés pour les segments qui ne changent pas entre mises à jour d'index. Bien que généralement bénéfique, cela peut conduire à une utilisation accrue mémoire plus de 1,3 dans certains scénarios:

[...]

2) Fonction certaines requêtes telles que ord() et Rord() nécessitent une top instance FieldCache de niveau et peut donc conduire à une utilisation accrue de la mémoire. Envisager de remplacer ord() et rord() avec des alternatives, telles que la fonction requêtes basées sur ms() pour la date boosting.

Il mentionne les stratégies possibles pour fondé sur la date de traitement stimulant, mais que diriez-vous d'un certain nombre comme « rang » où le rang est un nombre compris entre 1 et le nombre total d'enregistrements?

rord() semble idéal ... d'autres stratégies?

Répondre

2

Le point d'utilisation des caches de champ basés sur des segments est de réduire le temps de chargement. Si vous voulez obtenir la valeur d'un champ après avoir ajouté un nouveau segment (ce qui est fait à chaque fois que vous commettez), il vous suffit de charger un nouveau cache de champ pour le segment nouvellement ajouté.

Ceci n'est pas possible avec ord et rord qui vous donne l'ordinal pour l'index entier au lieu de la valeur pour un seul document. Donc la seule solution pour vous serait de calculer le boost basé sur la valeur du champ "cur_rank" au lieu de son ord.

Voici comment fonctionne le boosting de date: il utilisait le rord du champ date pour calculer le boost, alors qu'il utilise maintenant le nombre de millisecondes entre la valeur du champ date et maintenant. Voir http://wiki.apache.org/solr/SolrRelevancyFAQ ("Comment puis-je augmenter le score des documents les plus récents") pour plus de détails.

+0

C'est ce que nous avons fini par faire. – danieltalsky

Questions connexes