ElasticSearch
Contacts
Tanguy Leroux
Consultant et Formateur @ Zenika
Elasticsearch Addict
@tlrx
http://github.com/tlrx
tlrx.dev@gmail.com
Hugo Lassiège
Associé chez Lateral-Thoughts
Utilise ElasticSearch chez Hopwork
@hugolassiege
hlassiege at gmail
La recherche, enjeu du SI
Exemple copyright by Habib Guerguachi @DevoxxFrance
La recherche, enjeu du SI
Exemple copyright by Habib Guerguachi @DevoxxFrance
Mettons en pratique
Agenda
Mise en place
Prérequis : Java > 6
Exemple :
cluster.name: elasticsearch-HLA
ElasticSearch
Et on va illustrer tout ça !
API REST / JSON
http://host:port/index(s)/type(s)/_action|id
Méthodes HTTP: GET, PUT, POST, DELETE
Quelques exemples
Indexer un document
PUT http://host:port/mediatheque/film/1
POST http://host:port/mediatheque/film/
Récupérer un document
GET http://host:port/mediatheque/film/1
Supprimer un document
DELETE http://host:port/mediatheque/film/1
Créer un index
POST http://host:port/mediatheque/musique
Rechercher
GET http://host:port/mediatheque/film/_search?q=django
GET http://host:port/_search?q=django
Mise en pratique :
indexer un document
Utiliser votre client REST préféré sur l'url http://localhost:9200
1. Envoyez une requête POST avec le document JSON d'un film (voir sur Github le fichier json)
2. Trouvez comment indexer le même document sans augmenter le nombre de documents dans l'index
3. Utilisez le fichier bulk.json pour indexer les 350 films
Mise en pratique :
rechercher un document
1. Trouvez le nombre de films comportant Django
2. Trouvez le nombre de films contenant "York" dans le champ filming_locations
3. Trouvez le nombre de films contenant "york" uniquement dans le filming_locations. Le résultat est-il différent ?
4. Trouvez le nombre de films contenant "Manhattan" puis "Manhatton" uniquement dans le champ filming_locations. Le résultat est-il différent ?
5. Corrigez la recherche précédente pour que la réponse ait le plus de résultats possibles
Bonus : En utilisant la recherche fuzzy de la dernière question, faire une recherche sur le champ filming_locations avec "Yark".
Mise en pratique :
rechercher un document
1. Quel est le premier film quand on recherche les films par le critère : "English" avec un boost de -1.5 sur le résumé du film ? Et sans ce boost ?
2. Moduler le score des résultats en faisant intervenir la note du film et le nombre de votes via la formule suivante : si nombre de note > 36000 alors ajout d'un bonus correspondant à la moyenne des notes (le champ rating)
3. Quel est le premier élément renvoyé avec un tri par note ?
4. Combien obtient-on d'élément si on filtre les films avec une note < 8.1 ?
Les facettes
Les facettes permettent d'agréger des résultats de recherche
Elle sont utilisées pour
ElasticSearch propose 9 types de facettes
L'idée est de faire parler les données en les regardant sous différentes facettes!
Terms Facet
GET 'http://localhost:9200/_search'
{
"query": {
"match": {
"titre": "django" }
},
"facets": {
"facet_genres": {
"terms": {
"field": "genre",
"size" : 10
}
}
}
}
}
Terms Facet (Réponse)
{
"hits":{...},
"facets":{
"facet_genres":{
"_type":"terms",
"missing":0,
"total":2,
"other":0,
"terms":[
{
"term":"western", "count":1
},
{
"term":"action", "count":1
}
]
}}}
Terms Facet (Réponse)
{
"hits":{...},
"facets":{
"facet_genres":{
"_type":"terms",
"missing":0,
"total":2,
"other":0,
"terms":[
{
"term":"western", "count":1
},
{
"term":"action", "count":1
}
]
}}}
Histogram Facet
GET 'http://localhost:9200/film/_search'
{
"query": {
"match_all": {}
},
"facets": {
"facet_entrees": {
"histogram": {
"field": "nb_entrees",
"interval": "1000000"
}
}
}
}
Histogram Facet (Réponse)
{
"hits": { ... },
"facets": {
"facet_entrees": {
"_type": "histogram",
"entries": [
{ "key": 1000000, "count": 1 },
{ "key": 2000000, "count": 1 },
{ "key": 3000000, "count": 1 }
]
}
}
}
Histogram Facet (Réponse)
{
"hits": { ... },
"facets": {
"facet_entrees": {
"_type": "histogram",
"entries": [
{ "key": 1000000, "count": 1 },
{ "key": 2000000, "count": 1 },
{ "key": 3000000, "count": 1 }
]
}
}
}
Date Histogram Facet
GET 'http://localhost:9200/film/_search'
{
"query": {...},
"facets": {
"facet_sortie_par_annee": {
"date_histogram": {
"field": "date_sortie", "interval": "year"
}
},
"facet_sortie_par_mois": {
"date_histogram": {
"field": "date_sortie", "interval": "month"
}
}
}
}
Date Histogram Facet (Réponse)
{ "hits" : {…},
"facets" : {
"facet_sortie_par_annee" : {
"_type" : "date_histogram",
"entries" : [
{ "time" : 1072915200000, "count" : 1 },
{ "time" : 1230768000000, "count" : 1 },
{ "time" : 1293840000000, "count" : 2 },
{ "time" : 1325376000000, "count" : 2 }
]
},
"facet_sortie_par_mois" : {
"_type" : "date_histogram",
"entries" : [
{ "time" : 1072915200000, "count" : 1 },...
]
}
}
}
Et aussi...
Mise en pratique :
Les facettes
1. Quels sont les 5 genres de films les plus représentés dans le jeu de données?
2. Quels sont les différents genres des films contenant "New York" dans le titre?
3. Construire la requête contenant la facette suivante: "5 films ont une note de 1, 7 films ont une note de 2, etc"
4. Rechercher tous les films d'action et comptabiliser ceux qui ont une note comprise entre 0 et 5, 5 et 8 et plus de 8
5. Calculer les statistiques du champ "rating_count" des films contenant le mot clé "Manhattan"
6. Rechercher tous les films d'action et comptabiliser ceux qui ont un acteur ou une actrice dont le nom est "Keaton"