Solr grâce au composant QueryElevationComponent permet de définir des requêtes pour lesquelles un ensemble de documents précis (documents sponsorisés) est systématiquement retourné en tête de liste de résultat. Même si en théorie ces documents ne sont pas les plus pertinents pour la requête en question, il seront mis en avant. Pour cela, il faut configurer et inclure le composant « Query Elevation » dans la liste des composants utilisés par le handler de requêtes.
<searchComponent name="elevator" class="solr.QueryElevationComponent" > <str name="config-file">elevate.xml</str> <!-- pick a fieldType to analyze queries --> <str name="queryFieldType">string</str> </searchComponent> <requestHandler name="/select" class="solr.SearchHandler"> <lst name="defaults"> <str name="defType">edismax</str> <str name="qf"> text^0.5 features^1.0 name^1.2 id^10.0 title^10.0 description^5.0 keywords^5.0 author^2.0 </str> <str name="df">text</str> <str name="mm">100%</str> </lst> <arr name="last-components"> <str>elevator</str> </arr> </requestHandler>
Les 2 éléments de configuration importants du composant QueryElevationComponent sont le fichier listant les requêtes et les documents à remonter en tête de résultats et le nom du type de champs à utiliser pour l’analyse de la requête de l’utilisateur.
La documentation détaillée concernant le paramètrage de ce composant est disponible sur la page « The Query Elevation Component » du Wiki Solr.
Je souhaite préciser l’utilisation du paramètre queryFieldType. Il s’agit du type de champs qui est utilisé pour analyser la requête utilisateur et donc la transformer au besoin. La documentation utilise en exemple un type « string » qui sera sans doute défini comme ceci :
<fieldType name="string" class="solr.StrField" sortMissingLast="true" />
En conséquence, la requête utilisateur ne subit aucune transformation et est passée telle quelle au composant QueryElevationComponent (pas de mise en minuscule par exemple).
Soit le fichier de configuration des requêtes qui contient :
<elevate> <query text="ipod"> <doc id="MA147LL/A" /> </query> </elevate>
Dans ce cas, seule la requête précise « ipod » fait remonter en tête de résultats le document « MA147LL/A ». « iPod » ou « Apple ipod » ne font pas remonter ce document en tête de résultats. Pour que ces 3 requêtes fassent remonter le document, il faut soit les déclarer toutes les 3 dans le fichier de configuration (ce qui n’est pas très efficace et peut devenir très lourd), soit utiliser un autre type de champs pour l’analyse de la requête utilisateur.
Déclarons le type « elevator » comme ceci et utilisons le comme queryFieldType.
<fieldType name="elevator" class="solr.TextField" positionIncrementGap="100"> <analyzer> <tokenizer class="solr.StandardTokenizerFactory"/> <filter class="solr.LowerCaseFilterFactory"/> <filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords_elevator.txt" /> </analyzer> </fieldType>
Si le fichier de mots vides « stopwords_elevator.txt » contient « apple », les requêtes « ipod », « iPod », « apple ipod » ou « Apple IPOD » sont toutes transformées en « ipod » et font donc remonter le document.