10 conseils pour de meilleures requêtes de recherche dans Apache Solr

Apache Solr est un moteur de recherche open source dans l'âme, mais c'est bien plus que cela. C'est une base de données NoSQL avec un support transactionnel. Il s'agit d'une base de données de documents qui offre un support SQL et qui l'exécute de manière distribuée.

Auparavant, je vous ai montré comment créer et charger une collection dans Solr; vous pouvez charger cette collection maintenant si vous ne l'aviez pas déjà fait. (Divulgation complète: je travaille pour Lucidworks, qui emploie de nombreux contributeurs clés au projet Solr.)

Dans cet article, je vais vous montrer plus de 10 autres choses que vous pouvez faire avec cette collection:

1. Filtrer les requêtes

Considérez cette requête:

//localhost:8983/solr/ipps/select?fq=Provider_State:NC&indent=on&q=*:*&wt=json

À première vue, cette requête ressemble à si je viens de le faire q=Provider_State:NC. Cependant, les requêtes de filtrage ne renvoient que des ID et n'affectent pas le score. Les requêtes de filtre sont également mises en cache. C'est un bon moyen de trouver le plus pertinent q=blue suededans department:footwearpar opposition à department:clothingou department:music.

2. Facettes

Essayez cette requête:

//localhost:8983/solr/ipps/select?facet=on&facet.field=Provider_State&facet.limit=-1&indent=on&q=*:*&wt=json

Ce qui suit est renvoyé en haut:

ID

La facette vous donne le nombre de catégories (entre autres). Si vous implémentez un site de vente au détail, c'est ainsi que vous fournissez des catégories et des nombres de catégories pour les départements ou d'autres façons de diviser votre inventaire.

3. Gamme de facettes

Ajoutez ceci à une chaîne de requête: facet.interval=Average_Total_Payments&facet.interval.set=[0,1999.99]&facet.interval.set=[2000,2999.99]&facet.interval.set=[3000,3999.99]&facet.interval.set=[4000,4999.99]&facet.interval.set=[5000,5999.99]&facet.interval.set=[6000,6999.99]&facet.interval.set=[7000,7999.99]&&facet.interval.set=[8000,8999.99]&facet.interval.set=[9000,10000]

Tu auras:

Cette facette de plage peut aider à diviser un champ numérique en catégories de plages. Si vous aidez quelqu'un à trouver un ordinateur portable dans la fourchette de 2 000 $ à 3 000 $, c'est pour vous. Vous pouvez faire une requête similaire sans coder en dur les plages en procédant à la place:facet.range=Average_Total_Payments&facet.range.gap=999.99&facet.range.start=2000&facet.range.end=10000

4. DocValues

Dans votre schéma, assurez-vous que l' docValuesattribut est sélectionné pour les champs sur lesquels vous effectuez des facettes. Cela optimise le champ pour ces types de recherches et économise de la mémoire au moment de la requête, comme indiqué dans cet extrait schema.xml:

5. PseudoFields

Vous pouvez effectuer des opérations sur vos données et renvoyer une valeur. Essaye ça:

//localhost:8983/solr/ipps/select?fl=Provider_Name,%20Average_Total_Payments,price_category:if(min(0,sub(Average_Total_Payments,5000)),%22inexpensive%22,%22expensive%22)&indent=on&q=*:*&rows=10&wt=json

L'exemple utilise certaines des fonctions intégrées de Solr pour classer les fournisseurs comme coûteux ou peu coûteux en fonction du total moyen des paiements. J'ai mis price_category:if(min(0,sub(Average_Total_Payments,5000)),"inexpensive","expensive")dans la flliste des champs, ou, avec deux autres champs.

6. Analyseurs de requêtes

defType vous permet de choisir l'un des analyseurs de requêtes de Solr. L'analyseur de requêtes standard par défaut est vraiment adapté aux requêtes spécifiques générées par la machine. Mais Solr a également les analyseurs Dismax et eDismax, qui sont mieux pour les gens normaux: vous pouvez cliquer sur l'un d'entre eux en bas de l'écran de requête d'administration ou l'ajouter defType=dismaxà votre chaîne de requête. L'analyseur Dismax produit généralement de meilleurs résultats pour les requêtes saisies par l'utilisateur en trouvant le «maximum de disjonction», ou le champ avec le plus de correspondances, et en l'ajoutant au score.

7. Boosting

Si vous effectuez une recherche Provider_State:AL^5 OR Provider_State:NC^10, les résultats en Caroline du Nord seront mieux notés que les résultats en Alabama. Vous pouvez le faire dans votre requête ( q=""). C'est un moyen important de manipuler les résultats renvoyés.

8. Plages de dates

Bien que les données d'exemple ne prennent en charge aucune recherche de plage de dates, si elles le faisaient, elles seraient formatées comme timestamp_dt:[2016-12-31T17:51:44.000Z TO 2017-02-20T18:06:44.000Z]. Solr prend en charge les champs de type de date et les recherches et le filtrage de type de date.

9. TF-IDF et BM25

Le mécanisme de notation d'origine utilisé par Solr (pour déterminer quels documents étaient pertinents pour votre terme de recherche) est appelé TF-IDF, pour «fréquence du terme par rapport à la fréquence inverse du document». Il renvoie la fréquence d'apparition d'un terme dans votre champ ou document par rapport à la fréquence à laquelle ce terme apparaît globalement dans votre collection. Le problème avec cet algorithme est que «Game of Thrones» se produit 100 fois dans un document de 10 pages contre dix fois dans un document de 10 pages ne rend pas le document 10 fois plus pertinent. Cela le rend plus pertinent mais pas 1 0 fois plus pertinent.

BM25 adoucit ce processus, permettant aux documents d'atteindre un point de saturation, après quoi l'impact des occurrences supplémentaires est atténué. Les versions récentes de Solr utilisent toutes BM25 par défaut.

10. debugQuery

Dans la console Admin Query, vous pouvez vérifier debugQuery pour l'ajouter debugQuery=onà la chaîne de requête Solr. Si vous inspectez les résultats, vous trouverez cette sortie:

Entre autres choses, vous voyez qu'il utilise LuceneQParser (le nom de l'analyseur de requête standard) et, au-dessus de cela, comment chaque résultat a été noté. Vous voyez l'algorithme BM25 lui-même et comment les boosts ont affecté le score. Si vous essayez de déboguer votre recherche, c'est un outil très précieux!

Ces dix aspects de Solr m'aident certainement lors de l'utilisation de Solr pour la recherche et le réglage de mes résultats.