Apache Solr
Recherches
Requête
Pour effectuer une recherche, il suffit de passer par une requête HTTP GET. Imaginons que l'on
ait au préalable indexé le document "superheroes.xml" comme vu dans la section précédente. Le document
propre à Superman est donc présent dans l'index.
On demande ici, tous les documents comportant un champ "powers" ayant pour valeur "agility". C'est
en effet le cas pour Spider-Man. Il suffit d'accéder à l'URL Select suivante :
http://localhost:8983/solr/select?q=powers:agility&start=0&rows=10&fl=name,supername
Les paramètres "start" et "rows" permettent de spécifier que l'on souhaite retourner 10 résultats depuis le début (index 0).
Le paramètre "fl" permet de spécifier quels sont les champs que l'on souhaite retourner pour les documents qui matchent. Si celui-ci n'est pas renseigné, tous les champs des documents matchés seront renvoyés. Dans notre cas, on veut uniquement le nom et le supernom des héros trouvés.
La réponse est formalisée en XML :
<response> <lst name="responseHeader"> <int name="status">0</int> <int name="QTime">0</int> <str name="q">powers:agility</str> </lst> <result name="response" numFound="1" start="0"> <doc> <str name="name">Peter Parker</str> <str name="supername">Spider-Man</str> </doc> </result> </response>
Le status à 0 signifie que l'opération s'est correctement déroulée. Le QTime à 0 est le temps de traitement côté serveur.
On retrouve bien la requête dans le "q", en rouge. Dans cet exemple, un seul document est retourné (numFound=1). Il s'agit bien du document décrivant Spider-Man. On retrouve aussi les deux seuls champs demandés, en bleu, le nom et le super-nom.
Format de sortie
La réponse est par défaut retournée au format XML, mais de nombreux outils ont été conçus pour traiter la réponse dans différents langages. Ainsi, les langages les plus utilisés sont gérés :- XML (standard)
- JSON (notation Javascript)
- Ruby
- Python
- PHP
- XSLT
Scoring
La notion de scoring correspond au calcul effectué afin de déterminer l'ordre des résultats suite
à une requête.
Le calcul est de la forme :
score = tf * idf * lengthNorm * boosts |
Avec :
- tf (term frequency) : Plus un terme apparaît de fois dans le document, plus sa valeur est grande
- idf (inverse document frequency) - Cette valeur correspond à : nombre de documents total / nombre de documents contenant le terme
- lengthNorm : Cette valeur tient compte du nombre de termes dans le champ. Ainsi, seront privilégiés les champs contenant le plus petit nombre de termes.
- index-time boost et query-clause boost : ils permettent de "booster" des champs. Lors de l'indexation, par exemple, on peut vouloir qu'un champ soit davantage valorisé par rapport à d'autres. On peut utiliser un "boost" lors de la requête également.
Par défaut c'est donc le scoring qui est utilisé pour ordonner les résultats renvoyés suite à une requête. Ainsi, les documents disposant d'un scoring le plus élévé apparaîtront dans les premiers.
Mais il est toutefois possible de spécifier explicitement l'ordre des résultats. Si l'on veut par exemple que les résultats apparaissement par ordre alphabétique, il suffit de le préciser dans la requête :
select?q=powers:agility;sort=name asc
"desc" permet de trier dans l'ordre descendant.
Si l'on souhaite afficher le score de chaque résultat retourné, il suffit de le spécifié dans le paramètre "fl" :
select?q=powers:agility;fl=*,score
L'astérisque signifie que l'on souhaite afficher tous les champs ; ici le calcul du score est ajouté.
Syntaxe des requêtes
Pour rappel, une requête est spécifiée derrière le "q=" dans l'URL Select (voir plus haut). Lorsque plusieurs termes
séparés par des espaces sont spécifiés dans une requête, l'opérateur logique par défaut est le OR.
Voici quelques exemples de requêtes afin de balayer différentes syntaxes possibles :
- name:Parker : tous les documents comportant Parker dans le champ "name".
- Parker : tous les documents comportant Parker dans les champs par défaut. Ces champs sont en fait définis lors de la configuration (voir Configuration et schema.xml).
- name:"Peter Parker" AND supername:Spider-Man : tous les documents qui comportent à la fois la chaîne "Peter Parker" dans le champ "name" et le terme Spider-Man dans le champ "supername".
- name:Peter^10 story:Peter : les documents qui comportent le terme Peter dans les champs "name" ou "story", en privilégient les documents dont le mot Peter apparaît plus de fois dans le champ "name".
-
+name:Parker +supername:Spider-Man –powers:flight : les documents qui contiennent le terme Parker dans le champ
"name" et le terme Spider-Man dans le champ "supername", mais qui ne comportent pas le terme flight dans
le champ "powers".
NB : le + est identique au AND. - id:[0 TO 1000] : les documents dont les ID sont compris entre 0 et 1000 inclus.
- Par?er, Pet*r, Peter*, *:* : le point d'interrogation ou joker correspond à "n'importe quel caractère". l'astérisque correspond à "n'importe quel ensemble de caractères".