Recherche
Définition : Recherches avec une query DSL
Le query DSL Domain Specific Language) permet d'exprimer des définitions complexes de requêtes.
Il existe deux types de query DSL :
Requêtes :
Le résultat dépend d'un score attribué aux documents
Répond à la question : À quel point ce document correspond-il à cette clause de requête ? Score
Filtres :
Pas de manipulation de score
Répond à la question : Ce document correspond-il à cette clause de requête ? Oui / Non
La même recherche que dans l'exemple précédant, sous forme DSL, permettant de retourner tous les documents :
POST http://localhost:9200/biblio/_search
{
"query": { "match_all": {} }
}
Méthode : Paramètres de recherche
En plus de la query, on peut passer d'autres paramètres dans le corps de la requête, notamment pour faire de la pagination. Par exemple, la requête suivante retournera uniquement le premier résultat. Le paramètre par défaut de size est 10.
POST http://localhost:9200/biblio/_search
{
"query": { "match_all": {} },
"size": 1
}
Celle-ci retournera les documents 11 à 20. Par défaut, la valeur du paramètre from est 0.
POST http://localhost:9200/biblio/_search
{
"query": { "match_all": {} },
"from": 10,
"size": 10
}
Le paramètre _source permet de définir quels sont les champs qui doivent être retournés. La requête suivante retournera uniquement l'auteur et le titre du livre :
POST http://localhost:9200/biblio/_search
{
"query": { "match_all": {} },
"_source": ["titre", "auteur"]
}
Pour certaines recherche il peut être intéressant d'ajouter un tri. On utilise le mot clé sort pour en définir les critères. Il est possible d'utiliser des tris simples (alphabétique), ou dépendants du type de donnée (par date ou par distance kilométrique en sont deux exemples). Deux champs spécifiques permettent d’accéder à des métadonnées, _score permet d'ordonner par les score (comportement par défaut), _doc permet de trier selon leur index. Il est possible de combiner les critère de tri, comme dans l'exemple suivant :
POST http://localhost:9200/biblio/livres/_search
{
"query": {"match_all": {} },
"sort" : [
{ "pages" : "desc" },
"auteur",
"_doc"
]
}
Méthode : Construction d'une requête
Nous avons déjà vu comment faire pour récupérer tous les documents. Pour effectuer une recherche sur un champ spécifique, on peut utiliser le mot clé match. La requête suivante permet de récupérer tous les document dont l’auteur est Stephen King :
POST http://localhost:9200/biblio/_search
{
"query": { "match": { "auteur": "Stephen King" } }
}
Par défaut chaque mot séparé par un espace sera traité comme un OR. Elasticsearch classe les résultat par leur score, qui défini leur pertinence. C'est donc pour cela que lors de la recherche sur Stephen King, on peut trouver d'autres auteurs comme Stephen Covey. Étant donné qu'un seul mot sur les deux correspond, leur score est moins bon et se trouve à la fin des résultats.
Pour traiter une phrase entière comme un ensemble, il faut utiliser match_phrase
POST http://localhost:9200/biblio/_search
{
"query": { "match_phrase": { "auteur": "Stephen King" } }
}
Pour combiner plusieurs contraintes, on peut utiliser le type de requête bool. Celle-ci permet de combiner différentes clauses avec des AND (must), OR (should) et de AND NOT (must_not). La requête suivante permet de récupérer les documents écrit par Stephen King de genre fantastique sauf le livre Shining :
POST http://localhost:9200/biblio/livres/_search
{
"query": {
"bool": {
"must": [
{ "match": { "auteur": "Stephen King" }},
{ "match": { "genre": "fantastique" }}
],
"must_not": [
{ "match": { "titre": "Shining" } }
]}}}
Il est possible de faire une recherche sur tous les champs d'un document en substituant le nom du champs par _all.
Méthode : Filtre
On peut ajouter un filtre sur nos critères pour restreindre la recherche : les clauses inclues dans le filtre n'influent pas sur le score, mais éliminent directement les documents inutiles.
Par exemple, pour effectuer une recherche parmi les livres d'au moins 2000 pages :
POST http://localhost:9200/biblio/livres/_search
{
"query": {
"bool": {
"must": [
{ "match": { "auteur": "Stephen King" }},
{ "match": { "genre": "fantastique" }}
],
"must_not": [
{ "match": { "titre": "Shining" } }
],
"filter": {
"range": {
"pages": {
"gt": 2000
}}}}}}
Parametres d'une recherche de plage :
gte Greater-than or equal to
gt Greater-than
lte Less-than or equal to
lt Less-than
Fondamental :
Les clauses d'une query et d'une filtre sont interchangeables dans leur syntaxe, seule leur interprétation pour la requête change.
En plus des mots clés cités ici, il y en a de nombreux autres qui ne seront pas étudiés ici. Certains permettent d'ajouter des clauses spécifiques à un type de donnée (les dates, les coordonnées géographiques, ...), d'autres de modifier le type même de la requête (bool query, function score query, ...), d'ajouter des paramètres à la recherche, ou encore de modifier la manière dont sont analysés les mots (tolérance d'erreur). Leur comportement est similaire à ceux étudiés ici, il suffit donc de consulter la documentation dont le lien est indiqué en bas de la page.