Maîtriser le DSL de Requête Elasticsearch : Commandes Essentielles pour la Récupération de Données
Elasticsearch est réputé pour sa rapidité et sa flexibilité dans la gestion de volumes massifs de données structurées et non structurées. Au cœur de sa puissance de récupération réside le Query Domain Specific Language (DSL) – un langage puissant basé sur JSON, utilisé pour définir des requêtes de recherche sophistiquées via l'API de Recherche. Comprendre le DSL de Requête est crucial pour aller au-delà des simples recherches par mots-clés afin d'effectuer des récupérations de données précises, filtrées et agrégées.
Ce guide vous présentera les composants fondamentaux du DSL de Requête Elasticsearch. Nous explorerons les types de requêtes principaux, démontrerons comment les combiner pour une logique complexe en utilisant les requêtes bool, et fournirons des exemples pratiques pour vous aider à maîtriser la récupération efficace de données à partir de vos index.
L'Anatomie d'une Requête de Recherche Elasticsearch
Toutes les recherches Elasticsearch sont effectuées sur le point de terminaison _search d'un index spécifique (ou de plusieurs index). Une requête de recherche basique est une requête POST contenant un corps JSON qui définit les paramètres de la requête. La partie la plus critique de ce corps est l'objet query.
Structure de base :
POST /your_index_name/_search
{
"query": { ... Définissez votre structure de requête ici ... },
"size": 10,
"from": 0
}
Types de Requêtes Principaux : Précision et Pertinence
Le DSL de Requête offre un large éventail de requêtes adaptées à différents types de données et besoins de correspondance. Le choix de la requête a un impact significatif sur le score de pertinence et les performances.
1. Recherche en Texte Intégral : La Requête match
La requête match est le standard pour la recherche en texte intégral sur les champs analysés. Elle tokenise le terme de recherche et vérifie les tokens correspondants dans le(s) champ(s) spécifié(s).
Cas d'utilisation : Rechercher du texte en langage naturel où le score de pertinence est important.
Exemple : Trouver des documents où le champ 'description' contient le mot 'cloud' ou 'computing'.
GET /products/_search
{
"query": {
"match": {
"description": "cloud computing"
}
}
}
2. Correspondance de Valeur Exacte : La Requête term
La requête term recherche les documents contenant le terme exact spécifié. Contrairement à match, elle n'effectue pas d'analyse sur la chaîne de recherche, ce qui la rend idéale pour les correspondances exactes sur les mots-clés, les identifiants ou les champs indexés numériquement.
Cas d'utilisation : Filtrer par des valeurs exactes dans des champs non analysés (comme les champs keyword ou les nombres).
Exemple : Récupérer un produit avec l'ID exact SKU10021.
GET /products/_search
{
"query": {
"term": {
"product_id": "SKU10021"
}
}
}
3. Requêtes de Plage (range)
Les requêtes de plage vous permettent de filtrer les documents dont la valeur d'un champ se situe dans une plage spécifiée (numérique, date ou chaîne de caractères).
Syntaxe : Utilise gt (supérieur à), gte (supérieur ou égal à), lt (inférieur à) et lte (inférieur ou égal à).
Exemple : Trouver les commandes passées après le 1er janvier 2024.
GET /orders/_search
{
"query": {
"range": {
"order_date": {
"gte": "2024-01-01",
"lt": "2025-01-01"
}
}
}
}
4. Filtrage par Présence : La Requête exists
La requête exists identifie les documents où un champ spécifique est présent (c'est-à-dire non nul ou non manquant).
Exemple : Trouver tous les utilisateurs ayant fourni une adresse e-mail.
GET /users/_search
{
"query": {
"exists": {
"field": "email_address"
}
}
}
Construire une Logique Complexe avec la Requête bool
Pour la quasi-totalité des applications de recherche du monde réel, vous devez combiner plusieurs critères. La requête bool est l'outil essentiel pour cela, vous permettant de combiner d'autres clauses de requête en utilisant la logique booléenne.
Clauses au sein de bool
La requête bool accepte quatre clauses principales :
must: Toutes les clauses de ce tableau doivent correspondre. Les clausesmustcontribuent au score de pertinence.filter: Toutes les clauses de ce tableau doivent correspondre, mais elles sont exécutées dans un contexte sans scoring. Cela les rend beaucoup plus rapides pour les critères d'inclusion/exclusion stricts.should: Au moins une clause de ce tableau devrait correspondre. Ces clauses influencent le score de pertinence mais sont facultatives pour la correspondance.must_not: Aucune des clauses de ce tableau ne doit correspondre (l'équivalent d'un NOT logique).
Exemple Pratique de Requête bool
Combinons plusieurs concepts pour trouver des documents à haute priorité qui mentionnent 'sécurité', mais excluent les brouillons et sont disponibles dans la région 'US'.
GET /logs/_search
{
"query": {
"bool": {
"must": [
{
"match": {
"content": "security breach"
}
}
],
"filter": [
{
"term": {
"region.keyword": "US"
}
}
],
"should": [
{
"term": {
"priority": 5
}
}
],
"must_not": [
{
"term": {
"status.keyword": "DRAFT"
}
}
]
}
}
}
Explication de l'exemple :
- Must : Le document doit contenir la phrase "security breach" dans le champ de contenu analysé.
- Filter : Le document doit être tagué pour la région 'US' (une correspondance exacte et rapide).
- Should : Les documents correspondant à
priority: 5recevront un coup de pouce dans leur score de pertinence, mais les documents avec des priorités plus faibles qui répondent aux clausesmustetfilterseront toujours renvoyés. - Must Not : Les documents marqués comme 'DRAFT' sont strictement exclus.
Bonnes Pratiques pour la Construction de Requêtes
Pour garantir que vos recherches soient à la fois précises et performantes, respectez ces directives :
- Préférer
filteràmustpour les critères sans scoring. Si vous ne faites que vérifier l'inclusion/exclusion (par exemple, filtrer par ID, date exacte ou statut), utilisez toujours la clausefilterdans une requêtebool. Cela tire parti de la mise en cache et évite les calculs de scoring coûteux. - Utiliser les Requêtes Exactes à Bon Escient : Pour les champs mappés comme
text(analysés), utilisezmatch. Pour les champs mappés commekeyword(non analysés), utiliseztermou les requêtes de plage (range). - Éviter l'Imbrication Profonde : Bien que possible, les requêtes
boolprofondément imbriquées peuvent devenir difficiles à lire et à déboguer, et peuvent parfois entraîner une dégradation des performances. - Tirer Parti de
minimum_should_match: Pour les clausesshould, définirminimum_should_match(par exemple, à1ou2) force un certain nombre de ces critères facultatifs à être satisfaits, les transformant ainsi en critères obligatoires tout en leur permettant de contribuer au scoring.
Maîtriser le DSL de Requête signifie apprendre à choisir le bon outil pour la bonne tâche – utiliser la puissance analytique de match lorsque le contexte est important, et la précision et la rapidité de term et filter lorsque l'exactitude est requise. En appliquant ces types de requêtes fondamentaux et en tirant parti de la puissance combinatoire de la requête bool, vous pouvez construire des stratégies de récupération de données très efficaces et performantes dans Elasticsearch.