xebicon'16 : les requêtes avancées dans elasticsearch par gérome egron et ivan beauvais,...
Post on 16-Apr-2017
175 Views
Preview:
TRANSCRIPT
@xebiconfr #xebiconfr
Advanced queryingWith ElasticsearchIvan Beauvais / Gérôme Egron
@xebiconfr
KNOWLEDGE SHOULD BE FOR ALL
1
@xebiconfr #xebiconfr
Présentation des speakers
2
@xebiconfr #xebiconfr
Différents types de recherche
1. Recherche Full Text
2. Recherche Exacte
3. Aggrégation
3
@xebiconfr #xebiconfr
Recherche Full text14
@xebiconfr #xebiconfr
Indexation d’un document
POST http://localhost:9200/directory/company{ "name": "Xebia-France", "address": { "street": "156 Boulevard Haussmann", "postalCode": 75008, "city": "paris" }}
"properties": { "name": { "type": "string" }, "address": { "properties": { "city": { "type": "string" }, "postalCode": { "type": "long" }, "street": { "type": "string" } } } }
Document Mapping
5
@xebiconfr #xebiconfr
Traitement d’un document
document
_source
fields
{ "name": "Xebia-France", "address": { "street": "156 Boulevard Haussmann", "postalCode": 75008, "city": "paris" }}
"name": "Xebia-France","address.street": "156 Boulevard Haussmann","address.postalCode": 75008,"address.city": "paris"
mapping
Index inversé
6
@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
@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
@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
@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
@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
@xebiconfr #xebiconfr
Recherche Exacte212
@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
@xebiconfr #xebiconfr
Mapping
Recherche Full Text
"content": { "type": "string", "analyzer": "standard" "index" : "analyzed"}
Recherche exacte
"sendDate": { "type": "date", "format": "YYYYMMddHHmmss"}
"age": { "type": "integer"}
"author": { "type": "string", "index": "not_analyzed"}
14
@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
@xebiconfr #xebiconfr
Bool query : must
GET _search{ "query": { "bool": { "must": [ { "match": { "content": { "value": "La Xebicon" } } }, { "match": { "content": "Xebia" } } ] } }}
16
@xebiconfr #xebiconfr
Bool query : should
GET _search{ "query": { "bool": { "should": [ { "match": { "content": { "value": "La Xebicon" } } }, { "match": { "content": "Xebia" } } ] } }}
17
@xebiconfr #xebiconfr
Bool query : must_not
GET _search{ "query": { "bool": { "must_not": [ { "match": { "content": { "value": "2015" } } } ] } }}
18
@xebiconfr #xebiconfr
Bool query : filter
GET _search{ "query": { "bool": { "filter": [ { "term": { "age": { "value": 12 } } } ] } }}
19
@xebiconfr #xebiconfr
Aggregation320
@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
@xebiconfr #xebiconfr
Bucket aggregation
"name" : "Pierre","age" : 12
"name" : "Paul","age" : 16
"name" : "Jacques","age" : 8
Pierre count : 2 Paul count : 1Jacques count : 1
"name" : "Pierre","age" : 20 Term
aggregation sur "name"
22
@xebiconfr #xebiconfr
Metrics aggregation
"name" : "Pierre","age" : 12
"name" : "Paul","age" : 16
"name" : "Jacques","age" : 8
Avg : 14
"name" : "Pierre","age" : 20 Avg
aggregation sur "age"
23
@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 : 16Jacques avg : 8
Pierre Paul Jacques
24
@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 : 16Jacques avg : 8
Pipeline aggregation average sur
"age par nom"
25
@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
@xebiconfr #xebiconfr
Hand’s on !https://gegron.github.io/es-requests/
27
@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
top related