Requêtes Elasticsearch : syntaxe, filtres et performances

Requête simple sans paramètres :

GET /donnees_exemple/_search

Requêtes conditionnelles

Recherche dans un champ spécifique :

GET /donnees_exemple/_search?q=description:paris

Résultats retournés :

{
  "took": 30,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "donnees_exemple",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "description": "La tour Eiffel à Paris"
        }
      }
    ]
  }
}

Exclusion de terme :

GET /donnees_exemple/_search?q=-description:paris

Timeout configuré :

GET /donnees_exemple/_search?q=description:paris&timeout=10ms

Requêtes multi-index

Recherche sur plusieurs indices :

GET /articles,documents/_search?q=titre:php

Avec wildcard :

GET /articles*/_search?q=titre:php

Pagination

Exemple de pagination :

GET /articles/_search?q=titre:php&from=0&size=3

DSL (Domain Specific Language)

Requête avec tri par prix décroissant :

GET /produits/_search
{
  "query": {
    "match": {
      "titre": "php"
    }
  },
  "sort": [
    {
      "prix": {
        "order": "desc"
      }
    }
  ]
}

Requête de pagination avec DSL :

GET /produits/_search
{
  "query": {"match_all": {}},
  "from": 0,
  "size": 20
}

Spécification des champs retournés :

GET /produits/_search
{
  "query": {"match_all": {}},
  "_source": ["titre", "prix"]
}

Recherche multi-champs :

GET /produits/_search
{
  "query": {
    "multi_match": {
      "query": "recherche",
      "fields": ["titre", "description"]
    }
  }
}

Recherche de plage de prix :

GET /produits/_search
{
  "query": {
    "range": {
      "prix": {
        "gte": 10,
        "lte": 20
      }
    }
  }
}

Recherche exacte (non tokenisée) :

GET /produits/_search
{
  "query": {
    "term": {
      "titre": "développement_php"
    }
  }
}

Recherche multiple exacte :

GET /produits/_search
{
  "query": {
    "terms": {
      "titre": ["développement_php", "javascript"]
    }
  }
}

Existence de champ :

PUT /produits/_doc/1
{
  "nom": "produit1"
}

PUT /produits/_doc/2
{
  "nom": "produit2",
  "age": 18
}

GET /produits/_search
{
  "query": {
    "exists": {
      "field": "age"
    }
  }
}

Recherche floue :

GET /produits/_search
{
  "query": {
    "fuzzy": {
      "description": {
        "value": "facebok"
      }
    }
  }
}

Recherche par ID :

GET /produits/_search
{
  "query": {
    "ids": {
      "values": [1, 2, 3]
    }
  }
}

Recherche préfixe :

GET /produits/_search
{
  "query": {
    "prefix": {
      "titre": {
        "value": "dell"
      }
    }
  }
}

Recherche regexp :

GET /produits/_search
{
  "query": {
    "regexp": {
      "description": "fa.*ok"
    }
  }
}

Requête booléenne combinée :

DELETE /blog

PUT /blog/_doc/1
{
  "titre": "cours hadoop",
  "contenu": "hadoop est très mauvais",
  "auteur_id": 111
}

PUT /blog/_doc/2
{
  "titre": "cours es",
  "contenu": "es est très mauvais",
  "auteur_id": 112
}

PUT /blog/_doc/3
{
  "titre": "cours es",
  "contenu": "es est très bon",
  "auteur_id": 111
}

GET /blog/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "titre": "es"
          }
        }
      ],
      "should": [
        {
          "match": {
            "contenu": "es"
          }
        }
      ],
      "must_not": [
        {
          "match": {
            "auteur_id": 111
          }
        }
      ]
    }
  }
}

Filtres vs Requêtes

Les filtres améliorent les perfomrances en évitant le calcul de score. Exemple :

GET /produits/_search
{
  "query": {
    "bool": {
      "must": [
        {
          "match": {
            "description": "site officiel Facebook"
          }
        }
      ],
      "filter": [
        {
          "range": {
            "prix": {
              "gte": 7,
              "lte": 20
            }
          }
        }
      ]
    }
  }
}

Comparaison :

  • Requête : calcule le score de pertinence, affecte le tri.
  • Filtre : optimise les performances grâce au cache et ignore le score.

Utilisation correcte du filtre :

GET /produits/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "prix": {
            "gte": 7,
            "lte": 20
          }
        }
      }
    }
  }
}

Tri après filtre :

GET /produits/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "prix": {
            "gte": 7,
            "lte": 20
          }
        }
      }
    }
  },
  "sort": [
    {
      "prix": {
        "order": "desc"
      }
    }
  ]
}

Étiquettes: Elasticsearch dsl filter range-query bool-query

Publié le 15 septembre à 08h18