28
@xebiconfr #xebiconfr Advanced querying With Elasticsearch Ivan Beauvais / Gérôme Egron @xebiconfr KNOWLEDGE SHOULD BE FOR ALL 1

XebiCon'16 : Les requêtes avancées dans ElasticSearch Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

Embed Size (px)

Citation preview

Page 1: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@xebiconfr #xebiconfr

Advanced queryingWith ElasticsearchIvan Beauvais / Gérôme Egron

@xebiconfr

KNOWLEDGE SHOULD BE FOR ALL

1

Page 2: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@xebiconfr #xebiconfr

Présentation des speakers

2

Page 3: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@xebiconfr #xebiconfr

Différents types de recherche

1. Recherche Full Text

2. Recherche Exacte

3. Aggrégation

3

Page 4: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@xebiconfr #xebiconfr

Recherche Full text14

Page 5: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 6: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 7: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 8: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 9: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 10: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 11: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 12: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@xebiconfr #xebiconfr

Recherche Exacte212

Page 13: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 14: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 15: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 16: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@xebiconfr #xebiconfr

Bool query : must

GET _search{ "query": { "bool": { "must": [ { "match": { "content": { "value": "La Xebicon" } } }, { "match": { "content": "Xebia" } } ] } }}

16

Page 17: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@xebiconfr #xebiconfr

Bool query : should

GET _search{ "query": { "bool": { "should": [ { "match": { "content": { "value": "La Xebicon" } } }, { "match": { "content": "Xebia" } } ] } }}

17

Page 18: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@xebiconfr #xebiconfr

Bool query : must_not

GET _search{ "query": { "bool": { "must_not": [ { "match": { "content": { "value": "2015" } } } ] } }}

18

Page 19: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@xebiconfr #xebiconfr

Bool query : filter

GET _search{ "query": { "bool": { "filter": [ { "term": { "age": { "value": 12 } } } ] } }}

19

Page 20: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@xebiconfr #xebiconfr

Aggregation320

Page 21: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 22: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 23: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 24: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 25: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 26: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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

Page 27: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@xebiconfr #xebiconfr

Hand’s on !https://gegron.github.io/es-requests/

27

Page 28: XebiCon'16  : Les requêtes avancées dans ElasticSearch  Par Gérome Egron et Ivan Beauvais, Développeurs Java chez Xebia

@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