2013-03-12 3 views
1

J'ai un problème avec le renforcement en utilisant Solr. Nous avons récemment changé de Lucene à Solr.Luttant avec une requête solr et de la pertinence

Nous avons 4 champs de recherche (principaux) que nous recherchons: essence, mots-clés, allSearchable, et qualité; où, pour chaque document de l'index, essence contient les 3 premiers mots non-stop dans les mots-clés. 'keywords' est juste une liste de mots-clés. Et 'allSearchable' contient des données qui sont juste une collection d'autres données pour un document donné. Ce que nous avons fait dans Lucene était de faire 3 recherches pour une recherche donnée qu'un utilisateur a tapé dans la zone de recherche (afin de classer les résultats de recherche par pertinence), comme suit:

mot tapé dans searchbox: tree

Query 1: +essence:tree (trier par 'qualité') Si la requête 1 renvoie assez pour la page que nous voulons obtenir, puis retour.

Requête 2: +keywords:tree (trier par 'qualité') si la combinaison de Requête 1 et Requête 2 a renvoyé suffisamment de résultats pour la page sur laquelle nous sommes, puis renvoyer les résultats.

Requête 3: +allSearchable:tree (Trier par 'qualité') Retourne les résultats. S'il n'y en a pas, alors bonne chance.

Mon problème est avec la pagination. Je n'avais pas l'habitude d'envoyer une pagination (startIndex, rows) à Lucene. Je pourrais juste demander tout, et ensuite rouler sur tout ce que je récupère, ramassant suffisamment de résultats pour revenir, en fonction de la page que je demandais. Avec Solr, je dois passer des paramètres de pagination. Nous avons plus de 8 millions de documents dans notre index, donc pour obtenir tout ce qui correspond à une requête comme «arbre» ​​est trop cher. Le problème est que si je demande la page 3 dans la requête 1, et que je n'obtiens pas assez de résultats, alors je dois passer à la question 2 (keywords: tree). Mais ce n'est pas correct, parce que je demande les résultats de la page 3 pour la requête 2 (en d'autres termes, donnez-moi tous les documents qui correspondent aux «mots-clés: arbre» ​​pour la page 3). Mais ce n'est pas vraiment la question que je veux poser. Je veux seulement demander la page 1 des mots-clés si l'essence ne correspond à rien. Etc. Ce que je cherche vraiment, c'est une requête, qui suffirait pour ces trois requêtes que j'ai faites auparavant, de telle sorte que je récupère les correspondances d'essence en premier, le mot-clé correspond en second, et l'allSearchable correspond en dernier.

J'ai essayé avec rappel avec cette requête: essence:tree^4.0 keywords:tree^2.0 allSearchable:tree^1.0

Mais cela ne semble pas faire l'affaire, et je ne sais pas pourquoi? J'ai sorti les sortes, et les choses ne me rendent toujours pas les bons résultats. J'utilise le standard StandardRequestHandler (qui semble utiliser le LuceneQueryParser (pas dismax ou edismax) Je peux voir que les boosts sont envoyés à solr dans l'URL (j'utilise boosting en ajoutant un paramètre qf à la section defaults de mon requestHandler dans solrconfig.xml) Je sais certainement que Lucene peut comprendre ces paramètres.Quelqu'un peut me dire comment je pourrais être en mesure de construire une requête qui me permettrait d'obtenir des résultats comme je le veux ci-dessus? enter code here

Répondre

0

Je recommanderais en utilisant la ExtendedDismax Query Parser (eDisMax) et vous pouvez spécifier la relance à travers les champs comme indiqué dans l'exemple ci-dessous:

http://localhost:8983/solr/select/?q=tree 
    &defType=edismax&qf=essence^4.0+keywords^2.0+allSearchable^1.0 

vous pourriez avoir besoin d'ajuster t Il augmente les valeurs dans les champs pour obtenir les résultats souhaités. De plus, il existe des paramètres supplémentaires pour eDisMax qui effectuent le boosting et comment la requête est exécutée que vous devriez examiner.

+0

Merci.Je ne sais pas s'il est acceptable de poser des questions de suivi, alors donnez-moi une fessée si je suis hors ligne. QUESTION: Puis-je envoyer des requêtes lucene (sous la forme + searchField: searchValue) à edismax? – Tucker

+0

Oui, selon la section Syntaxe de requête (à partir du lien ci-dessus), elle prend en charge LuceneQuerySyntax complet, y compris les recherches par champs. –

+0

OK. Mes tests unitaires le confirment également. Tout ce que j'ai fait, c'est exécuter une tonne de requêtes différentes, ayant changé defType en edismax, et tous les tests passés. Merci Paige! – Tucker