Cet exercice a pour objectif :
- de faire une recherche sur un jeu de données
- d'agréger des donnnées
- Commençons par insérer quelques données ...
curl -XPOST 'http://localhost:9200/heroes/_doc/ironman' -H 'Content-Type: application/json' -d '{"firstName":"Tony","lastName":"Stark","aka":"Iron Man","team":"Avengers","age":45}'
curl -XPOST 'http://localhost:9200/heroes/_doc/thor' -H 'Content-Type: application/json' -d '{"firstName":"Thor","lastName":"Odinson","aka":"Thor","team":"Avengers","age":27}'
curl -XPOST 'http://localhost:9200/heroes/_doc/antman' -H 'Content-Type: application/json' -d '{"firstName":"Hank","lastName":"Pym","aka":"Ant-Man","team":"Avengers","age":41}'
curl -XPOST 'http://localhost:9200/heroes/_doc/wasp' -H 'Content-Type: application/json' -d '{"firstName":"Janet","lastName":"van Dyne","aka":"Wasp","team":"Avengers","age":32}'
curl -XPOST 'http://localhost:9200/heroes/_doc/hulk' -H 'Content-Type: application/json' -d '{"firstName":"Bruce","lastName":"Banner","aka":"Hulk","team":"Avengers","age":41}'
curl -XPOST 'http://localhost:9200/heroes/_doc/misterfantastic' -H 'Content-Type: application/json' -d '{"firstName":"Reed","lastName":"Richards","aka":"Mister Fantastic","team":"FantasticFour","age":47}'
curl -XPOST 'http://localhost:9200/heroes/_doc/invisiblewoman' -H 'Content-Type: application/json' -d '{"firstName":"Susan","lastName":"Storm","aka":"Invisible Woman","team":"FantasticFour","age":29}'
curl -XPOST 'http://localhost:9200/heroes/_doc/thehumantorch' -H 'Content-Type: application/json' -d '{"firstName":"Johnny","lastName":"Storm","aka":"The Human Torch","team":"FantasticFour","age":25}'
curl -XPOST 'http://localhost:9200/heroes/_doc/thething' -H 'Content-Type: application/json' -d '{"firstName":"Ben","lastName":"Grimm","aka":"The Thing","team":"FantasticFour","age":42}'
- L'API
_search
permet d'effectuer des recherches dans ElasticSearch.
- La requête suivante lance une recherche sur l'ensemble des documents de l'index
heroes
(par défault, une recherche remonte 10 résultats) :
curl -XPOST 'http://localhost:9200/heroes/_search'
- Il est possible de formatter correctement le résultat de la recherche grâce au paramètre
pretty
.
curl -XPOST 'http://localhost:9200/heroes/_search?pretty'
- La requête suivante permet de rechercher tous les documents qui ont un attribut
lastName
dont la valeur eststorm
:
curl -XPOST 'http://localhost:9200/heroes/_search' -H 'Content-Type: application/json' -d '{
"query": {
"match": {
"lastName": "storm"
}
}
}'
- La requête suivante permet d'effectuer une recherche sur les documents dont le prénom commence par un
t
:
curl -XPOST 'http://localhost:9200/heroes/_search' -H 'Content-Type: application/json' -d '{
"query": {
"wildcard": {
"firstName": {
"value": "t*"
}
}
}
}'
-
Il est possible de faire des recherches à plusieurs niveaux :
-
- sur un index donné :
http://localhost:9200/heroes/_search
- sur un index donné :
-
- sur plusieurs index :
http://localhost:9200/heroes,vilains/_search
- sur plusieurs index :
-
- sur l'ensemble des index d'un cluster :
http://localhost:9200/_search
- sur l'ensemble des index d'un cluster :
-
Effectuez maintenant quelques recherches à l'aide de requêtes de type Query String Query.
-
Les agrégations permettent de regrouper les données et d'effectuer des calculs sur les documents contenus dans les index.
-
Bien qu'il soit possible de combiner recherche et agrégations, nous ne nous intéressons pas ici aux recherches (d'où l'attribut
"size": 0
...). -
Pour obtenir la répartition des valeurs du terme
team
dans les documents de l'indexheroes
:
curl -XPOST 'http://localhost:9200/heroes/_search' -H 'Content-Type: application/json' -d '{
"size": 0,
"aggs" : {
"teams" : {
"terms": {
"field": "team.keyword"
}
}
}
}'
- Il est possible de faire des sous-agrégations. Pour obtenir la répartition des valeurs du terme
lastName
dans la répartition du termeteam
dans les documents de l'indexheroes
:
curl -XPOST 'http://localhost:9200/heroes/_search' -H 'Content-Type: application/json' -d '{
"size": 0,
"aggs" : {
"teams" : {
"terms": {
"field": "team.keyword"
},
"aggs" : {
"names" : {
"terms": {
"field": "lastName.keyword"
}
}
}
}
}
}'
- Il est possible de faire des calculs avec les agrégations. Par exemple pour l'âge moyen des membres de chaque équipe :
curl -XPOST 'http://localhost:9200/heroes/_search' -H 'Content-Type: application/json' -d '{
"size": 0,
"aggs" : {
"teams" : {
"terms": {
"field": "team.keyword",
"order" : { "avgAge" : "desc" }
},
"aggs" : {
"avgAge" : {
"avg" : {
"field" : "age"
}
}
}
}
}
}'
-
Quelques exercices complémentaires :
-
- Vous pouvez à présent écrire une agrégation qui calcule l'âge maximum par équipe.
-
- Vous pouvez à présent écrire une agrégation qui calcule l'âge maximum par équipe pour les personnages dont le nom commence par la lettre 't'.
-
- En utilisant les agrégations de type Histogram, créez une agrégation permettant de regrouper les héros par tranche d'âge (par dizaine).
L'API
_search
permet d'effectuer des recherches dans ElasticSearch.
- En utilisant les agrégations de type Histogram, créez une agrégation permettant de regrouper les héros par tranche d'âge (par dizaine).
L'API