ElasticSearch vient avec un DSL très riche de requètage : recherche full text, recherche exact, analytiques, géolocalisation, "Search as you type" ... Nous vous proposons de venir découvrir avec ce hands-on, les possibilités offertes par ce moteur d’indexation en utilisant les différentes types de recherches proposées et en jouant sur le mapping. Quelles requêtes pour quel besoin et comment les utiliser de manière efficace.
7. @xebiconfr #xebiconfr
Index inversé
Term Frequency ID Document
xebia 1 1
france 1 1
voyages 1 2
sncf 2 2,3
"name": "Xebia-France"
"name": "Voyages-sncf"
"name": "sncf"
7
8. @xebiconfr #xebiconfr
Analyse
● Dépend du mapping du champ
● Effectué en 3 phases : Filter, Tokenizer, Token Filter
● Appliqué sur les valeurs des champs avant l’enregistrement
dans l’index inversé
● N’impacte pas le document original sauvegardé (_source)
8
9. @xebiconfr #xebiconfr
Analyse : exemple
"Bienvenue à la
XebiCon" Filter Tokenizer Index
"bienvenue a la
xebicon"
["bienvenue",
"a","la","xebicon"]
["bienvenue","xebicon”]
match: {title : "La xebicon"}
Filter Tokenizer Token Filter query
match: {title :
"la xebicon"}
match: {title :
["la", "xebicon"]}
match: {title :
"xebicon"}
Recherche
Indexation
Token Filter
Stop word : a, la
9
10. @xebiconfr #xebiconfr
Scoring des documents
● Term frequency : plus un terme est présent dans un champ plus
le score est élevé
● Inverse document frequency : plus un terme est présent dans
tous les documents de l’index moins le score est élevé
● Field-length norm : Plus le champ est court plus le score est
élevé
10
11. @xebiconfr #xebiconfr
Match query
GET my_index/company/_search
{
"query": {
"match": {
"name": "La Xebicon"
}
}
}
Result :
{
"_index": "my_index",
"_type": "company",
"_id": "1",
"_score": 0.2169777,
"_source": {
"name": "Bienvenue à la XebiCon"
}
}
11
13. @xebiconfr #xebiconfr
Recherche exacte
● Similaire à une clause "where" en SQL
● Pas de score sur les documents : le document respecte la
condition ou ne la respecte pas
● Coupler à la recherche full texte permet de réduire le nombre de
document à scorer
● Mis en cache
13
15. @xebiconfr #xebiconfr
Recherche full text vs Recherche exacte
analyze
Match query
Scope query
Scoring
Recherche Full Text
Not analyzed
term query
Scope filter
Bool result
Recherche exacte
15
21. @xebiconfr #xebiconfr
Aggregation
● Equivalent à "count", "groupBy", "Max" ... en SQL
● On ne remonte plus des documents mais on collecte des
informations contenues dans les champs des documents
● Utilisés conjointement aux filtres
21
22. @xebiconfr #xebiconfr
Bucket aggregation
"name" : "Pierre",
"age" : 12
"name" : "Paul",
"age" : 16
"name" : "Jacques",
"age" : 8
Pierre count : 2
Paul count : 1
Jacques count : 1
"name" : "Pierre",
"age" : 20
Term
aggregation
sur "name"
22
24. @xebiconfr #xebiconfr
Sub aggregation
"name" : "Pierre",
"age" : 12
"name" : "Paul",
"age" : 16
"name" : "Jacques",
"age" : 8
"name" : "Pierre",
"age" : 20
Term
aggregation
sur "name"
Avg
aggregation
sur "age"
Pierre avg : 16
Paul avg : 16
Jacques avg : 8
Pierre
Paul
Jacques
24
25. @xebiconfr #xebiconfr
Pipeline aggregation
Avg : 13.3
"name" : "Pierre",
"age" : 12
"name" : "Paul",
"age" : 16
"name" : "Jacques",
"age" : 8
"name" : "Pierre",
"age" : 20
Term
aggregation sur
"name"
Avg aggregation
sur "age"
Pierre
Paul
Jacques
Pierre avg : 16
Paul avg : 16
Jacques avg : 8
Pipeline
aggregation
average sur
"age par nom"
25
26. @xebiconfr #xebiconfr
Aggregation en pratique
● Moyenne, minimum, maximum des prix sur un scope de
document
● Somme des valeurs d’un champ numérique de tous les
documents
● Percentiles des temps de réponse stockés dans l’index
● Toutes les valeurs possibles pour un champ
● Nombre de document compris entre des plages de dates ou des
coordonnées GPS
26
28. @xebiconfr #xebiconfr
Vous avez vu
● Ajouter/Supprimer/Rechercher des documents
● Utiliser la mapping afin de supprimer le code html du texte
● Utiliser le mapping pour ajouter des synonymes
● Rechercher avec une "Match" query
● Filtrer sur un range de date
● Faire une recherche sur plusieurs champs
● Faire de la suggestion en mode "fuzzy"
● Agréger par term et par term de term
● Faire des requêtes géolocalisées
● Faire des agrégations sur des distances à un point
28