@xebiconfr #xebiconfr
Advanced querying
With Elasticsearch
Ivan Beauvais / Gérôme Egron
@xebiconfr
KNOWLEDGE SHOULD BE FOR...
@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 text
1
4
@xebiconfr #xebiconfr
Indexation d’un document
POST http://localhost:9200/directory/company
{
"name": "Xebia-France",
"add...
@xebiconfr #xebiconfr
Traitement d’un document
document
_source
fields
{
"name": "Xebia-France",
"address": {
"street": "1...
@xebiconfr #xebiconfr
Index inversé
Term Frequency ID Document
xebia 1 1
france 1 1
voyages 1 2
sncf 2 2,3
"name": "Xebia-...
@xebiconfr #xebiconfr
Analyse
● Dépend du mapping du champ
● Effectué en 3 phases : Filter, Tokenizer, Token Filter
● Appl...
@xebiconfr #xebiconfr
Analyse : exemple
"Bienvenue à la
XebiCon" Filter Tokenizer Index
"bienvenue a la
xebicon"
["bienven...
@xebiconfr #xebiconfr
Scoring des documents
● Term frequency : plus un terme est présent dans un champ plus
le score est é...
@xebiconfr #xebiconfr
Match query
GET my_index/company/_search
{
"query": {
"match": {
"name": "La Xebicon"
}
}
}
Result :...
@xebiconfr #xebiconfr
Recherche Exacte
2
12
@xebiconfr #xebiconfr
Recherche exacte
● Similaire à une clause "where" en SQL
● Pas de score sur les documents : le docum...
@xebiconfr #xebiconfr
Mapping
Recherche Full Text
"content": {
"type": "string",
"analyzer": "standard"
"index" : "analyze...
@xebiconfr #xebiconfr
Recherche full text vs Recherche exacte
analyze
Match query
Scope query
Scoring
Recherche Full Text
...
@xebiconfr #xebiconfr
Bool query : must
GET _search
{
"query": {
"bool": {
"must": [
{
"match": {
"content": {
"value": "L...
@xebiconfr #xebiconfr
Bool query : should
GET _search
{
"query": {
"bool": {
"should": [
{
"match": {
"content": {
"value"...
@xebiconfr #xebiconfr
Bool query : must_not
GET _search
{
"query": {
"bool": {
"must_not": [
{
"match": {
"content": {
"va...
@xebiconfr #xebiconfr
Bool query : filter
GET _search
{
"query": {
"bool": {
"filter": [
{
"term": {
"age": {
"value": 12
...
@xebiconfr #xebiconfr
Aggregation
3
20
@xebiconfr #xebiconfr
Aggregation
● Equivalent à "count", "groupBy", "Max" ... en SQL
● On ne remonte plus des documents m...
@xebiconfr #xebiconfr
Bucket aggregation
"name" : "Pierre",
"age" : 12
"name" : "Paul",
"age" : 16
"name" : "Jacques",
"ag...
@xebiconfr #xebiconfr
Metrics aggregation
"name" : "Pierre",
"age" : 12
"name" : "Paul",
"age" : 16
"name" : "Jacques",
"a...
@xebiconfr #xebiconfr
Sub aggregation
"name" : "Pierre",
"age" : 12
"name" : "Paul",
"age" : 16
"name" : "Jacques",
"age" ...
@xebiconfr #xebiconfr
Pipeline aggregation
Avg : 13.3
"name" : "Pierre",
"age" : 12
"name" : "Paul",
"age" : 16
"name" : "...
@xebiconfr #xebiconfr
Aggregation en pratique
● Moyenne, minimum, maximum des prix sur un scope de
document
● Somme des va...
@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...
Prochain SlideShare
Chargement dans…5
×

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

291 vues

Publié le

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.

Publié dans : Technologie
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

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

  1. 1. @xebiconfr #xebiconfr Advanced querying With Elasticsearch Ivan Beauvais / Gérôme Egron @xebiconfr KNOWLEDGE SHOULD BE FOR ALL 1
  2. 2. @xebiconfr #xebiconfr Présentation des speakers 2
  3. 3. @xebiconfr #xebiconfr Différents types de recherche 1. Recherche Full Text 2. Recherche Exacte 3. Aggrégation 3
  4. 4. @xebiconfr #xebiconfr Recherche Full text 1 4
  5. 5. @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
  6. 6. @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
  7. 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. 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. 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. 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. 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
  12. 12. @xebiconfr #xebiconfr Recherche Exacte 2 12
  13. 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
  14. 14. @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
  15. 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
  16. 16. @xebiconfr #xebiconfr Bool query : must GET _search { "query": { "bool": { "must": [ { "match": { "content": { "value": "La Xebicon" } } }, { "match": { "content": "Xebia" } } ] } } } 16
  17. 17. @xebiconfr #xebiconfr Bool query : should GET _search { "query": { "bool": { "should": [ { "match": { "content": { "value": "La Xebicon" } } }, { "match": { "content": "Xebia" } } ] } } } 17
  18. 18. @xebiconfr #xebiconfr Bool query : must_not GET _search { "query": { "bool": { "must_not": [ { "match": { "content": { "value": "2015" } } } ] } } } 18
  19. 19. @xebiconfr #xebiconfr Bool query : filter GET _search { "query": { "bool": { "filter": [ { "term": { "age": { "value": 12 } } } ] } } } 19
  20. 20. @xebiconfr #xebiconfr Aggregation 3 20
  21. 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. 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
  23. 23. @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
  24. 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. 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. 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
  27. 27. @xebiconfr #xebiconfr Hand’s on ! https://gegron.github.io/es-requests/ 27
  28. 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

×