2010-12-15 6 views
2

J'utilise SolrNet pour accéder à un index Solr où j'ai un champ à valeurs multiples appelé "tags". Je veux effectuer la requête pseudo-code suivant:Comment faire une requête de score constant dans Solr

(tags: pile)^10 OR (tags: plus)^5 OR (tags: flux)^2

où le terme "pile" est en cours boosté de 10, "over" est boosté de 5 et "flow" est boosté de 2. Le résultat que je cherche est que les résultats avec "stack" apparaîtront plus haut qu'avec ceux avec "flow", etc.

Le problème que je rencontre est que "flow" n'apparaît que dans quelques documents, mais "stack" apparaît dans les charges, puis en raison d'une valeur élevée, les documents "flow" apparaissent au-dessus de ceux avec "stack". Lorsque ce projet a été implémenté directement dans Lucene, j'ai utilisé ConstantScoreQuery et ceux-ci ont éliminé l'idf en se basant uniquement sur la valeur boost. Comment cela peut-il être réalisé avec Solr et SolrNet, où je réussis juste à transmettre à Solr une chaîne de requête? Si ce n'est pas possible, y a-t-il une autre façon d'aborder ce problème?

Merci d'avance!

+0

et si vous supprimez le score boost de votre dernière clause? '(tags: flow)' Je crois que c'est une requête de score constant. Effectivement, c'est un coup de pouce de 1, qui est la valeur par défaut. – Josh

Répondre

2

Je ne pense pas qu'il existe un moyen d'exprimer directement un ConstantScoreQuery dans Solr, mais il semble que range and prefix queries use ConstantScoreQuery under the hood, de sorte que vous pouvez essayer faussant une requête de plage, par exemple. tags:[flow TO flow]

Vous pouvez également implémenter votre propre Soler QueryParser.

+0

Faking une requête de plage fonctionne un régal (pour le moment au moins). Je peux regarder l'implémentation d'un analyseur de requête personnalisé si le temps le permet. Merci. – robinbetts

3

Solr 5.1 et versions ultérieures ont ceci intégré dans la syntaxe de l'analyseur de requêtes via l'opérateur^=.

Il suffit donc de prendre votre requête originale: (tags: pile)^10 OR (tags: plus)^5 OR (tags: flux)^2

Et remplacer le^avec^= pour changer de boosté à la constante: (tags: pile)^= 10 OR (tags: over)^= 5 OR (tags: flow)^= 2

Questions connexes