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"
}
}
]
}