Elasticsearch.Le moteur de rechercheélastique pour tousDavid Pilato, Elasticsearch.com, Parismercredi 15 mai 13
Qui ?$ curl http://localhost:9200/talk/speaker/dpilato{"nom" : "David Pilato","jobs" : [{ "boite" : "SRA Europe (SSII)", "...
Qui ?$ curl http://localhost:9200/talk/speaker/dpilato{"nom" : "David Pilato","jobs" : [{ "boite" : "SRA Europe (SSII)", "...
ScrutMyDocs.orgmercredi 15 mai 13
Elasticsearch.com• Créée en 2012 par les auteursd’Elasticsearch• Formation (publique et intra)• Consulting (support dév)• ...
Pour la démoFaites du bruit sur Twitteravec le hashtag#elasticsearchmercredi 15 mai 13
SQL ClassiqueCherche moi un documentde décembre 2011 portant sur la franceet contenant produit et davidEn SQL :mercredi 15...
SQL ClassiqueCherche moi un documentde décembre 2011 portant sur la franceet contenant produit et davidEn SQL :SELECTdoc.*...
Au final, on obtientmercredi 15 mai 13
Moteur de recherche ?• un moteur d’indexation de documentsmercredi 15 mai 13
Moteur de recherche ?• un moteur d’indexation de documentsmercredi 15 mai 13
Moteur de recherche ?• un moteur d’indexation de documents• un moteur de recherche dans les indexmercredi 15 mai 13
Elasticsearchmercredi 15 mai 13
ElasticsearchYour Data, your Search !mercredi 15 mai 13
Elasticsearch• C’est un moteur !• NoSQL orienté document• Apache Lucene• HTTP / REST / JSON• Distribué, Scalable, Cloud re...
Points clésmercredi 15 mai 13
Points clés• Simple: start in 5 minutes 30 secondsmercredi 15 mai 13
Points clés• Simple: start in 5 minutes 30 seconds• Efficace: just start new nodes!mercredi 15 mai 13
Points clés• Simple: start in 5 minutes 30 seconds• Efficace: just start new nodes!• Puissant: 20-300ms!mercredi 15 mai 13
Points clés• Simple: start in 5 minutes 30 seconds• Efficace: just start new nodes!• Puissant: 20-300ms!• Complet: built-in...
Penser « document » !• Document : Un objet représentant les données (au sensNoSQL).Penser "recherche", cest oublier le SGB...
Penser « document » !• Document : Un objet représentant les données (au sensNoSQL).Penser "recherche", cest oublier le SGB...
Penser « document » !• Document : Un objet représentant les données (au sensNoSQL).Penser "recherche", cest oublier le SGB...
Penser « document » !• Document : Un objet représentant les données (au sensNoSQL).Penser "recherche", cest oublier le SGB...
Interagir avecElasticsearchmercredi 15 mai 13
Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE...
Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE...
Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE...
Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE...
Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE...
Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE...
Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE...
Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE...
Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE...
Indexer$ curl -XPUT localhost:9200/twitter/tweet/1 -d {"text": "Bienvenue à la conférence #elasticsearch pour #JUG","creat...
Indexer{"ok":true,"_index":"twitter","_type":"tweet","_id":"1"}$ curl -XPUT localhost:9200/twitter/tweet/1 -d {"text": "Bi...
Chercher$ curl localhost:9200/twitter/tweet/_search?q=elasticsearchmercredi 15 mai 13
Chercher$ curl localhost:9200/twitter/tweet/_search?q=elasticsearch{"took" : 24,"timed_out" : false,"_shards" : { "total" ...
Chercher$ curl localhost:9200/twitter/tweet/_search?q=elasticsearch{"took" : 24,"timed_out" : false,"_shards" : { "total" ...
Chercher$ curl localhost:9200/twitter/tweet/_search?q=elasticsearch{"took" : 24,"timed_out" : false,"_shards" : { "total" ...
Chercher$ curl localhost:9200/twitter/tweet/_search?q=elasticsearch{"took" : 24,"timed_out" : false,"_shards" : { "total" ...
Chercher$ curl localhost:9200/twitter/tweet/_search?q=elasticsearch{"took" : 24,"timed_out" : false,"_shards" : { "total" ...
Query DSL• Requêtes précises : plutôt que dechercher « à la google », on peututiliser des critères précis :mercredi 15 mai...
Query DSL• Requêtes précises : plutôt que dechercher « à la google », on peututiliser des critères précis :$ curl -XPOST l...
Injecter les donnéesEt au milieu coule une rivièremercredi 15 mai 13
La collectemercredi 15 mai 13
La collecteStockageDonnéesmercredi 15 mai 13
La collecteStockageDonnéesDocmercredi 15 mai 13
La collecteStockageDonnéesDocmercredi 15 mai 13
La collecteStockageDonnéesDocDocmercredi 15 mai 13
La collecteStockageDonnéesDoc Docmercredi 15 mai 13
La collecteStockageDonnéesDoc Docmercredi 15 mai 13
La collecteStockageDonnéesDoc Docmercredi 15 mai 13
La collecteStockageDonnéesDocDocmercredi 15 mai 13
La collecteStockageDonnéesDocDocDocmercredi 15 mai 13
La collecteStockageDonnéesDocDocDocmercredi 15 mai 13
La collecteStockageDonnéesDocDocDocmercredi 15 mai 13
Quelques Rivers...mercredi 15 mai 13
Quelques Rivers...• CouchDB Rivermercredi 15 mai 13
Quelques Rivers...• CouchDB River• CouchBase Rivermercredi 15 mai 13
Quelques Rivers...• CouchDB River• CouchBase River• MongoDB Rivermercredi 15 mai 13
Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC Rivermercredi 15 mai 13
Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia Rivermercredi 15 mai 13
Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter Rivermercredi 15 m...
Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ Ri...
Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ Ri...
Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ Ri...
Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ Ri...
Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ Ri...
Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ Ri...
Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ Ri...
AnalyserLa puissance des facettes !Faites parler vos données en les regardant sous différentes facettes !(Et en temps quas...
Des tweetsID Username Date Hashtag1 dadoonet 2012-04-18 12 talk 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04...
Term FacetD Username Date Hashtag1 dadoonet 2012-04-18 12 talk 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04-...
Term FacetD Username Date Hashtag1 dadoonet 2012-04-18 12 talk 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04-...
Term FacetD Username Date Hashtag1 dadoonet 2012-04-18 12 talk 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04-...
Term FacetD Username Date Hashtag1 dadoonet 2012-04-18 12 talk 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04-...
Term FacetD Username Date Hashtag1 dadoonet 2012-04-18 12 talk 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04-...
Date Histogram FacetDate Hashtag2012-04-18 12012-04-18 5h 2012-04-18 22012-04-18 22012-04-18 6h 2012-04-19 32012-04-19 320...
Date Histogram FacetDate Hashtag2012-04-18 12012-04-18 5h 2012-04-18 22012-04-18 22012-04-18 6h 2012-04-19 32012-04-19 320...
Date Histogram FacetDate Hashtag2012-04-18 12012-04-18 5h 2012-04-18 22012-04-18 22012-04-18 6h 2012-04-19 32012-04-19 320...
Date Histogram FacetDate Hashtag2012-04-18 12012-04-18 5h 2012-04-18 22012-04-18 22012-04-18 6h 2012-04-19 32012-04-19 320...
Date Histogram FacetDate Hashtag2012-04-18 12012-04-18 5h 2012-04-18 22012-04-18 22012-04-18 6h 2012-04-19 32012-04-19 320...
Date Histogram FacetDate Hashtag2012-04-18 12012-04-18 5h 2012-04-18 22012-04-18 22012-04-18 6h 2012-04-19 32012-04-19 320...
Range FacetHashtag152263374mercredi 15 mai 13
Range FacetHashtag152263374Hashtag Count Min Max Moy Totalx < 3 3 1 2 1.667 53 <= x < 5 3 3 4 3.333 10x >= 5 3 5 7 6 18mer...
Range FacetHashtag152263374mercredi 15 mai 13
Range FacetHashtag152263374"facets" : { "hashtags" : {"range" : { "field" : "hashtag","ranges" : [{ "to" : 3 },{ "from" : ...
Range FacetHashtag152263374"facets" : { "hashtags" : {"range" : { "field" : "hashtag","ranges" : [{ "to" : 3 },{ "from" : ...
Site marchandmercredi 15 mai 13
Site marchandmercredi 15 mai 13
Site marchandmercredi 15 mai 13
Site marchandmercredi 15 mai 13
Site marchandRangesTermTermRangesmercredi 15 mai 13
Analyse temps-réel• Faire un matchAll sur lensemble des données• Actualiser toutes les x secondes• Indexer en même temps l...
FacettesCartographiquesmercredi 15 mai 13
Reprenons notreformulairemercredi 15 mai 13
Reprenons notreformulaireRecherche Full Textmercredi 15 mai 13
Reprenons notreformulairemercredi 15 mai 13
Reprenons notreformulairemercredi 15 mai 13
DémonstrationAvez-vous fait du bruit ?mercredi 15 mai 13
Architecturemercredi 15 mai 13
Architecturemercredi 15 mai 13
ArchitectureTwitterStreamingAPImercredi 15 mai 13
ArchitectureTwitterStreamingAPImercredi 15 mai 13
ArchitectureTwitterRiverTwitterStreamingAPI$ curl -XPUT localhost:9200/_river/twitter/_meta -d {"type" : "twitter","twitte...
ArchitectureTwitterRiverTwitterStreamingAPIChrome$ curl -XPUT localhost:9200/_river/twitter/_meta -d {"type" : "twitter","...
Démonstrationhttp://onemilliontweetmap.com/http://www.scrutmydocs.orgmercredi 15 mai 13
Démonstrationhttp://onemilliontweetmap.com/http://www.scrutmydocs.orgmercredi 15 mai 13
ArchitectureUn peu plus de technique : partitions / réplications / scalabilitémercredi 15 mai 13
Lexiquemercredi 15 mai 13
Lexique• Nœud (node) : Une instance dElasticsearch(~ machine ?)mercredi 15 mai 13
Lexique• Nœud (node) : Une instance dElasticsearch(~ machine ?)• Cluster : Un ensemble de nœudsmercredi 15 mai 13
Lexique• Nœud (node) : Une instance dElasticsearch(~ machine ?)• Cluster : Un ensemble de nœuds• Partition (shard) : perme...
Lexique• Nœud (node) : Une instance dElasticsearch(~ machine ?)• Cluster : Un ensemble de nœuds• Partition (shard) : perme...
Créons un indexClusterNœud 1ClientCURLmercredi 15 mai 13
Créons un indexClusterNœud 1Shard 0Shard 1réplication non respectéeClientCURL$ curl -XPUT localhost:9200/twitter -d {"inde...
Créons un indexClusterNœud 2Shard 0Shard 1Nœud 1Shard 0Shard 1réplication respectéeClientCURL$ curl -XPUT localhost:9200/t...
Réallocation dynamiqueClusterNœud 1Shard 1Nœud 2Shard 0Shard 1Shard 0mercredi 15 mai 13
Réallocation dynamiqueClusterNœud 3Nœud 1Shard 1Nœud 2Shard 0Shard 1Shard 0 Shard 0mercredi 15 mai 13
Réallocation dynamiqueClusterNœud 3Nœud 1Shard 1Nœud 2Shard 0Shard 1Shard 0 Shard 0mercredi 15 mai 13
Réallocation dynamiqueClusterNœud 3Nœud 1Shard 1Nœud 2Shard 1Shard 0 Shard 0mercredi 15 mai 13
Réallocation dynamiqueClusterNœud 3Nœud 1Shard 1Nœud 2Shard 1Shard 0Shard 1Shard 0mercredi 15 mai 13
Réallocation dynamiqueClusterNœud 3Nœud 1Shard 1Nœud 2Shard 1Shard 0Nœud 4Shard 1Shard 0mercredi 15 mai 13
Réallocation dynamiqueClusterNœud 3Nœud 1Shard 1Nœud 2Shard 1Shard 0Nœud 4Shard 1Shard 0mercredi 15 mai 13
Réallocation dynamiqueClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0Nœud 4Shard 1Le tuning, cest trouver le bon équilibre entre ...
Indexons un document$ curl -XPUT localhost:9200/twitter/tweet/1 -d {"text": "Bienvenue à la conférence #elasticsearch pour...
Indexons un document$ curl -XPUT localhost:9200/twitter/tweet/1 -d {"text": "Bienvenue à la conférence #elasticsearch pour...
Indexons un document$ curl -XPUT localhost:9200/twitter/tweet/1 -d {"text": "Bienvenue à la conférence #elasticsearch pour...
Indexons un document$ curl -XPUT localhost:9200/twitter/tweet/1 -d {"text": "Bienvenue à la conférence #elasticsearch pour...
Indexons un 2èmedocument$ curl -XPUT localhost:9200/twitter/tweet/2 -d {"text": "Je fais du bruit pour #elasticsearch à #J...
Indexons un 2èmedocument$ curl -XPUT localhost:9200/twitter/tweet/2 -d {"text": "Je fais du bruit pour #elasticsearch à #J...
Indexons un 2èmedocument$ curl -XPUT localhost:9200/twitter/tweet/2 -d {"text": "Je fais du bruit pour #elasticsearch à #J...
Indexons un 2èmedocument$ curl -XPUT localhost:9200/twitter/tweet/2 -d {"text": "Je fais du bruit pour #elasticsearch à #J...
Indexons un 2èmedocument$ curl -XPUT localhost:9200/twitter/tweet/2 -d {"text": "Je fais du bruit pour #elasticsearch à #J...
Cherchons !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shar...
Cherchons !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shar...
Cherchons !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shar...
Cherchons !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shar...
Cherchons !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shar...
Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœu...
Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœu...
Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœu...
Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Cli...
Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Cli...
Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Cli...
Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Cli...
Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Cli...
La percolationOu la recherche inverséemercredi 15 mai 13
Usage courant d’unmoteur de recherche• J’indexe un document• Je cherche de temps en temps si undocument m’intéresse• Avec ...
La recherche inversée• Enregistrer ses critères de recherche• A chaque document indexé, onrécupère la liste des recherches...
Usage du percolator$ curl -XPOST localhost:9200/_percolator/twitter/dadoonet -d ’{"query" : { "term" : { "user.screen_name...
Usage du percolatormercredi 15 mai 13
Usage du percolator$ curl -XPUT localhost:9200/twitter/tweet/1&percolate=* -d {"text": "Bienvenue à la conférence #elastic...
Usage du percolator$ curl -XPUT localhost:9200/twitter/tweet/1&percolate=* -d {"text": "Bienvenue à la conférence #elastic...
Tout doit êtreindexé ?Analyse et mappingmercredi 15 mai 13
The lazy dog...mercredi 15 mai 13
The quick brown foxjumped over the lazy DogThe lazy dog...mercredi 15 mai 13
The quick brown foxjumped over the lazy dogThe quick brown foxjumped over the lazy DogThe lazy dog...mercredi 15 mai 13
Analyseur standard$ curl -XPOST localhost:9200/test/_analyze?analyzer=standard&pretty=1 -dThe quick brown fox jumped over ...
Analyseur standard$ curl -XPOST localhost:9200/test/_analyze?analyzer=standard&pretty=1 -dThe quick brown fox jumped over ...
Analyseur whitespace$ curl -XPOST localhost:9200/test/_analyze?analyzer=whitespace&pretty=1 -dThe quick brown fox jumped o...
Analyseur whitespace$ curl -XPOST localhost:9200/test/_analyze?analyzer=whitespace&pretty=1 -dThe quick brown fox jumped o...
Un analyseurUn ensemblede tokenizers etde filtresmercredi 15 mai 13
Un tokenizer• Découpe une chaine en « mots » ettransforme :• whitespace tokenizer :"the dog!" -> "the", "dog!"• standard t...
Un filtre• Supprime ou transforme un token :• asciifolding filter :éléphant -> elephant• stemmer filter (french) :elephants -...
Analyzer"analysis":{"analyzer":{"francais":{"type":"custom","tokenizer":"standard","filter":["lowercase", "stop_francais",...
Mapping"type1" : {"properties" : {"text1" : { "type" : "string", "analyzer" : "simple" },"text2" : { "type" : "string", "i...
Les types• string• integer / long• float / double• boolean• null• array• objects• multi_field• ip• geo_point• geo_shape• bin...
Champs spéciaux• _all (et include_in_all)• _source• _ttl• parent / child• nestedmercredi 15 mai 13
Autres fonctionnalités• highlighting• scoring• sort• explain• multi get / multi search• bulkmercredi 15 mai 13
Autres fonctionnalités• highlighting• scoring• sort• explain• multi get / multi search• bulkmercredi 15 mai 13
DémonstrationsCURL est ton ami !JAVA est aussi ton ami !mercredi 15 mai 13
La communauté~80 contributeurs directs au projet (+ de 4000 watchers et + de 840 forks)mercredi 15 mai 13
La communauté~250 inscrits sur la mailing list, 70 messages / mois, ~400 followers, ~200 sur meetupmercredi 15 mai 13
mercredi 15 mai 13
Rejoignez le mouvement !@ElasticsearchFRQuestions ?Slides sur http://fr.slideshare.net/dadoonet Sources sur https://github...
Upcoming SlideShare
Loading in...5
×

Elasticsearch - Esme sudria

1,654

Published on

Slides for an Elasticsearch talk at ESME Sudria, Paris

Published in: Technology
0 Comments
1 Like
Statistics
Notes
  • Be the first to comment

No Downloads
Views
Total Views
1,654
On Slideshare
0
From Embeds
0
Number of Embeds
3
Actions
Shares
0
Downloads
0
Comments
0
Likes
1
Embeds 0
No embeds

No notes for slide

Transcript of "Elasticsearch - Esme sudria"

  1. 1. Elasticsearch.Le moteur de rechercheélastique pour tousDavid Pilato, Elasticsearch.com, Parismercredi 15 mai 13
  2. 2. Qui ?$ curl http://localhost:9200/talk/speaker/dpilato{"nom" : "David Pilato","jobs" : [{ "boite" : "SRA Europe (SSII)", "mission" : "bon à tout faire", "date" : "1995" },{ "boite" : "SFR", "mission" : "touche à tout", "date" : "1997" },{ "boite" : "e-Brands / Vivendi", "mission" : "chef de projets", "date": "2000" },{ "boite" : "DGDDI (douane)", "mission" : "mouton à 5 pattes", "date" : "2005" },{ "boite" : "IDEO Technologies", "mission" : "directeur technique", "date" : "2012" },{ "boite" : "Elasticsearch.com", "mission" : "technical advocate", "date" : "2013" } ],"passions" : [ "famille", "job", "deejay" ],"blog" : "http://dev.david.pilato.fr/","twitter" : [ "@dadoonet", "@elasticsearchfr", "@scrutmydocs" ],"email" : "david@pilato.fr"}mercredi 15 mai 13
  3. 3. Qui ?$ curl http://localhost:9200/talk/speaker/dpilato{"nom" : "David Pilato","jobs" : [{ "boite" : "SRA Europe (SSII)", "mission" : "bon à tout faire", "date" : "1995" },{ "boite" : "SFR", "mission" : "touche à tout", "date" : "1997" },{ "boite" : "e-Brands / Vivendi", "mission" : "chef de projets", "date": "2000" },{ "boite" : "DGDDI (douane)", "mission" : "mouton à 5 pattes", "date" : "2005" },{ "boite" : "IDEO Technologies", "mission" : "directeur technique", "date" : "2012" },{ "boite" : "Elasticsearch.com", "mission" : "technical advocate", "date" : "2013" } ],"passions" : [ "famille", "job", "deejay" ],"blog" : "http://dev.david.pilato.fr/","twitter" : [ "@dadoonet", "@elasticsearchfr", "@scrutmydocs" ],"email" : "david@pilato.fr"}mercredi 15 mai 13
  4. 4. ScrutMyDocs.orgmercredi 15 mai 13
  5. 5. Elasticsearch.com• Créée en 2012 par les auteursd’Elasticsearch• Formation (publique et intra)• Consulting (support dév)• Abonnement annuel support pour laproduction avec 3 niveaux de SLA(délai de réponse et disponibilité)mercredi 15 mai 13
  6. 6. Pour la démoFaites du bruit sur Twitteravec le hashtag#elasticsearchmercredi 15 mai 13
  7. 7. SQL ClassiqueCherche moi un documentde décembre 2011 portant sur la franceet contenant produit et davidEn SQL :mercredi 15 mai 13
  8. 8. SQL ClassiqueCherche moi un documentde décembre 2011 portant sur la franceet contenant produit et davidEn SQL :SELECTdoc.*, pays.*FROMdoc, paysWHEREdoc.pays_code = pays.code ANDdoc.date_doc > to_date(2011-12, yyyy-mm) ANDdoc.date_doc < to_date(2012-01, yyyy-mm) ANDlower(pays.libelle) = france ANDlower(doc.commentaire) LIKE ‘%produit% ANDlower(doc.commentaire) LIKE ‘%david%;mercredi 15 mai 13
  9. 9. Au final, on obtientmercredi 15 mai 13
  10. 10. Moteur de recherche ?• un moteur d’indexation de documentsmercredi 15 mai 13
  11. 11. Moteur de recherche ?• un moteur d’indexation de documentsmercredi 15 mai 13
  12. 12. Moteur de recherche ?• un moteur d’indexation de documents• un moteur de recherche dans les indexmercredi 15 mai 13
  13. 13. Elasticsearchmercredi 15 mai 13
  14. 14. ElasticsearchYour Data, your Search !mercredi 15 mai 13
  15. 15. Elasticsearch• C’est un moteur !• NoSQL orienté document• Apache Lucene• HTTP / REST / JSON• Distribué, Scalable, Cloud readymercredi 15 mai 13
  16. 16. Points clésmercredi 15 mai 13
  17. 17. Points clés• Simple: start in 5 minutes 30 secondsmercredi 15 mai 13
  18. 18. Points clés• Simple: start in 5 minutes 30 seconds• Efficace: just start new nodes!mercredi 15 mai 13
  19. 19. Points clés• Simple: start in 5 minutes 30 seconds• Efficace: just start new nodes!• Puissant: 20-300ms!mercredi 15 mai 13
  20. 20. Points clés• Simple: start in 5 minutes 30 seconds• Efficace: just start new nodes!• Puissant: 20-300ms!• Complet: built-in + pluginsmercredi 15 mai 13
  21. 21. Penser « document » !• Document : Un objet représentant les données (au sensNoSQL).Penser "recherche", cest oublier le SGBDR et penser"Documents"• Type : Regroupe des documents de même type• Index : Espace logique de stockage des documents dont lestypes sont fonctionnellement communsmercredi 15 mai 13
  22. 22. Penser « document » !• Document : Un objet représentant les données (au sensNoSQL).Penser "recherche", cest oublier le SGBDR et penser"Documents"• Type : Regroupe des documents de même type• Index : Espace logique de stockage des documents dont lestypes sont fonctionnellement communs{"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad","truncated": false,"retweet_count": 0,"hashtag": [ { "text": "elasticsearch", "start": 27, "end": 40 },{ "text": "JUG", "start": 47, "end": 55 } ],"user": { "id": 51172224, "name": "David Pilato","screen_name": "dadoonet", "location": "France","description": "Soft Architect, Project Manager, Senior Developper.rnAt this time, enjoying NoSQLworld : CouchDB, ElasticSearch.rnDeeJay 4 times a year, just for fun !" }}mercredi 15 mai 13
  23. 23. Penser « document » !• Document : Un objet représentant les données (au sensNoSQL).Penser "recherche", cest oublier le SGBDR et penser"Documents"• Type : Regroupe des documents de même type{"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad","truncated": false,"retweet_count": 0,"hashtag": [ { "text": "elasticsearch", "start": 27, "end": 40 },{ "text": "JUG", "start": 47, "end": 55 } ],"user": { "id": 51172224, "name": "David Pilato","screen_name": "dadoonet", "location": "France","description": "Soft Architect, Project Manager, Senior Developper.rnAt this time, enjoying NoSQLworld : CouchDB, ElasticSearch.rnDeeJay 4 times a year, just for fun !" }}mercredi 15 mai 13
  24. 24. Penser « document » !• Document : Un objet représentant les données (au sensNoSQL).Penser "recherche", cest oublier le SGBDR et penser"Documents"• Type : Regroupe des documents de même type• Index : Espace logique de stockage des documents dont lestypes sont fonctionnellement communs{"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad","truncated": false,"retweet_count": 0,"hashtag": [ { "text": "elasticsearch", "start": 27, "end": 40 },{ "text": "JUG", "start": 47, "end": 55 } ],"user": { "id": 51172224, "name": "David Pilato","screen_name": "dadoonet", "location": "France","description": "Soft Architect, Project Manager, Senior Developper.rnAt this time, enjoying NoSQLworld : CouchDB, ElasticSearch.rnDeeJay 4 times a year, just for fun !" }}mercredi 15 mai 13
  25. 25. Interagir avecElasticsearchmercredi 15 mai 13
  26. 26. Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETEmercredi 15 mai 13
  27. 27. Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE• Documents• curl -XPUT http://localhost:9200/twitter/tweet/1mercredi 15 mai 13
  28. 28. Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE• Documents• curl -XPUT http://localhost:9200/twitter/tweet/1• curl -XGET http://localhost:9200/twitter/tweet/1mercredi 15 mai 13
  29. 29. Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE• Documents• curl -XPUT http://localhost:9200/twitter/tweet/1• curl -XGET http://localhost:9200/twitter/tweet/1• curl -XDELETE http://localhost:9200/twitter/tweet/1mercredi 15 mai 13
  30. 30. Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE• Documents• curl -XPUT http://localhost:9200/twitter/tweet/1• curl -XGET http://localhost:9200/twitter/tweet/1• curl -XDELETE http://localhost:9200/twitter/tweet/1• Recherche• curl -XPOST http://localhost:9200/twitter/tweet/_searchmercredi 15 mai 13
  31. 31. Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE• Documents• curl -XPUT http://localhost:9200/twitter/tweet/1• curl -XGET http://localhost:9200/twitter/tweet/1• curl -XDELETE http://localhost:9200/twitter/tweet/1• Recherche• curl -XPOST http://localhost:9200/twitter/tweet/_search• curl -XPOST http://localhost:9200/twitter/_searchmercredi 15 mai 13
  32. 32. Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE• Documents• curl -XPUT http://localhost:9200/twitter/tweet/1• curl -XGET http://localhost:9200/twitter/tweet/1• curl -XDELETE http://localhost:9200/twitter/tweet/1• Recherche• curl -XPOST http://localhost:9200/twitter/tweet/_search• curl -XPOST http://localhost:9200/twitter/_search• curl -XPOST http://localhost:9200/_searchmercredi 15 mai 13
  33. 33. Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE• Documents• curl -XPUT http://localhost:9200/twitter/tweet/1• curl -XGET http://localhost:9200/twitter/tweet/1• curl -XDELETE http://localhost:9200/twitter/tweet/1• Recherche• curl -XPOST http://localhost:9200/twitter/tweet/_search• curl -XPOST http://localhost:9200/twitter/_search• curl -XPOST http://localhost:9200/_search• Meta-données• curl -XGET http://localhost:9200/twitter/_statusmercredi 15 mai 13
  34. 34. Interagir avecElasticsearch• API REST : http://host:port/[index]/[type]/[_action/id]Méthodes HTTP : GET, POST, PUT, DELETE• Documents• curl -XPUT http://localhost:9200/twitter/tweet/1• curl -XGET http://localhost:9200/twitter/tweet/1• curl -XDELETE http://localhost:9200/twitter/tweet/1• Recherche• curl -XPOST http://localhost:9200/twitter/tweet/_search• curl -XPOST http://localhost:9200/twitter/_search• curl -XPOST http://localhost:9200/_search• Meta-données• curl -XGET http://localhost:9200/twitter/_status• curl -XPOST http://localhost:9200/_shutdownmercredi 15 mai 13
  35. 35. Indexer$ curl -XPUT localhost:9200/twitter/tweet/1 -d {"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad","truncated": false,"retweet_count": 0,"hashtag": [ { "text": "elasticsearch", "start": 27, "end": 40 },{ "text": "JUG", "start": 47, "end": 55 } ],"user": { "id": 51172224,"name": "David Pilato","screen_name": "dadoonet", "location": "France","description": "Soft Architect, Project Manager, Senior Developper.rnAt this time, enjoying NoSQL world : CouchDB, ElasticSearch.rnDeeJay 4 times ayear, just for fun !" }}mercredi 15 mai 13
  36. 36. Indexer{"ok":true,"_index":"twitter","_type":"tweet","_id":"1"}$ curl -XPUT localhost:9200/twitter/tweet/1 -d {"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad","truncated": false,"retweet_count": 0,"hashtag": [ { "text": "elasticsearch", "start": 27, "end": 40 },{ "text": "JUG", "start": 47, "end": 55 } ],"user": { "id": 51172224,"name": "David Pilato","screen_name": "dadoonet", "location": "France","description": "Soft Architect, Project Manager, Senior Developper.rnAt this time, enjoying NoSQL world : CouchDB, ElasticSearch.rnDeeJay 4 times ayear, just for fun !" }}mercredi 15 mai 13
  37. 37. Chercher$ curl localhost:9200/twitter/tweet/_search?q=elasticsearchmercredi 15 mai 13
  38. 38. Chercher$ curl localhost:9200/twitter/tweet/_search?q=elasticsearch{"took" : 24,"timed_out" : false,"_shards" : { "total" : 5, "successful" : 5, "failed" : 0 },"hits" : {"total" : 1,"max_score" : 0.227,"hits" : [ {"_index" : "twitter","_type" : "tweet","_id" : "1","_score" : 0.227, "_source" : {"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad",[…]}} ]}}mercredi 15 mai 13
  39. 39. Chercher$ curl localhost:9200/twitter/tweet/_search?q=elasticsearch{"took" : 24,"timed_out" : false,"_shards" : { "total" : 5, "successful" : 5, "failed" : 0 },"hits" : {"total" : 1,"max_score" : 0.227,"hits" : [ {"_index" : "twitter","_type" : "tweet","_id" : "1","_score" : 0.227, "_source" : {"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad",[…]}} ]}}Nb dedocumentsmercredi 15 mai 13
  40. 40. Chercher$ curl localhost:9200/twitter/tweet/_search?q=elasticsearch{"took" : 24,"timed_out" : false,"_shards" : { "total" : 5, "successful" : 5, "failed" : 0 },"hits" : {"total" : 1,"max_score" : 0.227,"hits" : [ {"_index" : "twitter","_type" : "tweet","_id" : "1","_score" : 0.227, "_source" : {"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad",[…]}} ]}}Coordonnéesmercredi 15 mai 13
  41. 41. Chercher$ curl localhost:9200/twitter/tweet/_search?q=elasticsearch{"took" : 24,"timed_out" : false,"_shards" : { "total" : 5, "successful" : 5, "failed" : 0 },"hits" : {"total" : 1,"max_score" : 0.227,"hits" : [ {"_index" : "twitter","_type" : "tweet","_id" : "1","_score" : 0.227, "_source" : {"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad",[…]}} ]}}Pertinencemercredi 15 mai 13
  42. 42. Chercher$ curl localhost:9200/twitter/tweet/_search?q=elasticsearch{"took" : 24,"timed_out" : false,"_shards" : { "total" : 5, "successful" : 5, "failed" : 0 },"hits" : {"total" : 1,"max_score" : 0.227,"hits" : [ {"_index" : "twitter","_type" : "tweet","_id" : "1","_score" : 0.227, "_source" : {"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad",[…]}} ]}}Documentsourcemercredi 15 mai 13
  43. 43. Query DSL• Requêtes précises : plutôt que dechercher « à la google », on peututiliser des critères précis :mercredi 15 mai 13
  44. 44. Query DSL• Requêtes précises : plutôt que dechercher « à la google », on peututiliser des critères précis :$ curl -XPOST localhost:9200/twitter/tweet/_search -d ’{"bool" : {"must" : {"term" : { "user" : "kimchy" }},"must_not" : {"range" : {"age" : { "from" : 10, "to" : 20 }}},"should" : [{"term" : { "tag" : "wow" }},{"match" : { "tag" : "elasticsearch is cool" }}]}}’mercredi 15 mai 13
  45. 45. Injecter les donnéesEt au milieu coule une rivièremercredi 15 mai 13
  46. 46. La collectemercredi 15 mai 13
  47. 47. La collecteStockageDonnéesmercredi 15 mai 13
  48. 48. La collecteStockageDonnéesDocmercredi 15 mai 13
  49. 49. La collecteStockageDonnéesDocmercredi 15 mai 13
  50. 50. La collecteStockageDonnéesDocDocmercredi 15 mai 13
  51. 51. La collecteStockageDonnéesDoc Docmercredi 15 mai 13
  52. 52. La collecteStockageDonnéesDoc Docmercredi 15 mai 13
  53. 53. La collecteStockageDonnéesDoc Docmercredi 15 mai 13
  54. 54. La collecteStockageDonnéesDocDocmercredi 15 mai 13
  55. 55. La collecteStockageDonnéesDocDocDocmercredi 15 mai 13
  56. 56. La collecteStockageDonnéesDocDocDocmercredi 15 mai 13
  57. 57. La collecteStockageDonnéesDocDocDocmercredi 15 mai 13
  58. 58. Quelques Rivers...mercredi 15 mai 13
  59. 59. Quelques Rivers...• CouchDB Rivermercredi 15 mai 13
  60. 60. Quelques Rivers...• CouchDB River• CouchBase Rivermercredi 15 mai 13
  61. 61. Quelques Rivers...• CouchDB River• CouchBase River• MongoDB Rivermercredi 15 mai 13
  62. 62. Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC Rivermercredi 15 mai 13
  63. 63. Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia Rivermercredi 15 mai 13
  64. 64. Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter Rivermercredi 15 mai 13
  65. 65. Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ Rivermercredi 15 mai 13
  66. 66. Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ River• ActiveMQ Rivermercredi 15 mai 13
  67. 67. Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ River• ActiveMQ River• RSS Rivermercredi 15 mai 13
  68. 68. Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ River• ActiveMQ River• RSS River• LDAP Rivermercredi 15 mai 13
  69. 69. Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ River• ActiveMQ River• RSS River• LDAP River• FS Rivermercredi 15 mai 13
  70. 70. Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ River• ActiveMQ River• RSS River• LDAP River• FS River• Dropbox Rivermercredi 15 mai 13
  71. 71. Quelques Rivers...• CouchDB River• CouchBase River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ River• ActiveMQ River• RSS River• LDAP River• FS River• Dropbox River• Dick Riversmercredi 15 mai 13
  72. 72. AnalyserLa puissance des facettes !Faites parler vos données en les regardant sous différentes facettes !(Et en temps quasi réel, s’il vous plait !)mercredi 15 mai 13
  73. 73. Des tweetsID Username Date Hashtag1 dadoonet 2012-04-18 12 talk 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04-18 25 talk 2012-04-18 66 elasticsearch 2012-04-19 37 dadoonet 2012-04-19 38 talk 2012-04-19 79 elasticsearch 2012-04-20 4mercredi 15 mai 13
  74. 74. Term FacetD Username Date Hashtag1 dadoonet 2012-04-18 12 talk 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04-18 25 talk 2012-04-18 66 elasticsearch 2012-04-19 37 dadoonet 2012-04-19 38 talk 2012-04-19 79 elasticsearch 2012-04-20 4mercredi 15 mai 13
  75. 75. Term FacetD Username Date Hashtag1 dadoonet 2012-04-18 12 talk 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04-18 25 talk 2012-04-18 66 elasticsearch 2012-04-19 37 dadoonet 2012-04-19 38 talk 2012-04-19 79 elasticsearch 2012-04-20 4Username Countdadoonet 3talk 3elasticsearch 3mercredi 15 mai 13
  76. 76. Term FacetD Username Date Hashtag1 dadoonet 2012-04-18 12 talk 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04-18 25 talk 2012-04-18 66 elasticsearch 2012-04-19 37 dadoonet 2012-04-19 38 talk 2012-04-19 79 elasticsearch 2012-04-20 4mercredi 15 mai 13
  77. 77. Term FacetD Username Date Hashtag1 dadoonet 2012-04-18 12 talk 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04-18 25 talk 2012-04-18 66 elasticsearch 2012-04-19 37 dadoonet 2012-04-19 38 talk 2012-04-19 79 elasticsearch 2012-04-20 4"facets" : {"users" : { "terms" : {"field" : "username"} }}mercredi 15 mai 13
  78. 78. Term FacetD Username Date Hashtag1 dadoonet 2012-04-18 12 talk 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04-18 25 talk 2012-04-18 66 elasticsearch 2012-04-19 37 dadoonet 2012-04-19 38 talk 2012-04-19 79 elasticsearch 2012-04-20 4"facets" : {"users" : { "terms" : {"field" : "username"} }}"facets" : {"users" : {"_type" : "terms","missing" : 0,"total": 9,"other": 0,"terms" : [{ "term" : "dadoonet", "count" : 3 },{ "term" : "talk", "count" : 3 },{ "term" : "elasticsearch", "count" : 3 }]}}mercredi 15 mai 13
  79. 79. Date Histogram FacetDate Hashtag2012-04-18 12012-04-18 5h 2012-04-18 22012-04-18 22012-04-18 6h 2012-04-19 32012-04-19 32012-04-19 7h 2012-04-20 4mercredi 15 mai 13
  80. 80. Date Histogram FacetDate Hashtag2012-04-18 12012-04-18 5h 2012-04-18 22012-04-18 22012-04-18 6h 2012-04-19 32012-04-19 32012-04-19 7h 2012-04-20 4Par moisPar moisDate Count2012-04 9mercredi 15 mai 13
  81. 81. Date Histogram FacetDate Hashtag2012-04-18 12012-04-18 5h 2012-04-18 22012-04-18 22012-04-18 6h 2012-04-19 32012-04-19 32012-04-19 7h 2012-04-20 4Par moisPar moisDate Count2012-04 9Par jourPar jourDate Count2012-04-18 52012-04-19 32012-04-20 1mercredi 15 mai 13
  82. 82. Date Histogram FacetDate Hashtag2012-04-18 12012-04-18 5h 2012-04-18 22012-04-18 22012-04-18 6h 2012-04-19 32012-04-19 32012-04-19 7h 2012-04-20 4mercredi 15 mai 13
  83. 83. Date Histogram FacetDate Hashtag2012-04-18 12012-04-18 5h 2012-04-18 22012-04-18 22012-04-18 6h 2012-04-19 32012-04-19 32012-04-19 7h 2012-04-20 4"facets" : {"perday" : {"date_histogram" : {"field" : "date","interval" : "day"}}}mercredi 15 mai 13
  84. 84. Date Histogram FacetDate Hashtag2012-04-18 12012-04-18 5h 2012-04-18 22012-04-18 22012-04-18 6h 2012-04-19 32012-04-19 32012-04-19 7h 2012-04-20 4"facets" : {"perday" : {"date_histogram" : {"field" : "date","interval" : "day"}}}"facets" : {"perday" : {"_type" : "date_histogram","entries": [{ "time": 1334700000000, "count": 5 },{ "time": 1334786400000, "count": 3 },{ "time": 1334872800000, "count": 1 }]}}mercredi 15 mai 13
  85. 85. Range FacetHashtag152263374mercredi 15 mai 13
  86. 86. Range FacetHashtag152263374Hashtag Count Min Max Moy Totalx < 3 3 1 2 1.667 53 <= x < 5 3 3 4 3.333 10x >= 5 3 5 7 6 18mercredi 15 mai 13
  87. 87. Range FacetHashtag152263374mercredi 15 mai 13
  88. 88. Range FacetHashtag152263374"facets" : { "hashtags" : {"range" : { "field" : "hashtag","ranges" : [{ "to" : 3 },{ "from" : 3, "to" : 5 },{ "from" : 5 }] } } }mercredi 15 mai 13
  89. 89. Range FacetHashtag152263374"facets" : { "hashtags" : {"range" : { "field" : "hashtag","ranges" : [{ "to" : 3 },{ "from" : 3, "to" : 5 },{ "from" : 5 }] } } }"facets" : {"hashtags" : {"_type" : "range","ranges" : [ {"to": 3,"count": 3,"min": 1, "max": 2,"total": 5, "mean": 1.667}, {"from":3, "to" : 5,"count": 3,"min": 3, "max": 4,"total": 10, "mean": 3.333},{"from":5,"count": 3,"min": 5, "max": 7,"total": 18, "mean": 6} ] } }mercredi 15 mai 13
  90. 90. Site marchandmercredi 15 mai 13
  91. 91. Site marchandmercredi 15 mai 13
  92. 92. Site marchandmercredi 15 mai 13
  93. 93. Site marchandmercredi 15 mai 13
  94. 94. Site marchandRangesTermTermRangesmercredi 15 mai 13
  95. 95. Analyse temps-réel• Faire un matchAll sur lensemble des données• Actualiser toutes les x secondes• Indexer en même temps les nouvelles donnéesTermDate histogrammercredi 15 mai 13
  96. 96. FacettesCartographiquesmercredi 15 mai 13
  97. 97. Reprenons notreformulairemercredi 15 mai 13
  98. 98. Reprenons notreformulaireRecherche Full Textmercredi 15 mai 13
  99. 99. Reprenons notreformulairemercredi 15 mai 13
  100. 100. Reprenons notreformulairemercredi 15 mai 13
  101. 101. DémonstrationAvez-vous fait du bruit ?mercredi 15 mai 13
  102. 102. Architecturemercredi 15 mai 13
  103. 103. Architecturemercredi 15 mai 13
  104. 104. ArchitectureTwitterStreamingAPImercredi 15 mai 13
  105. 105. ArchitectureTwitterStreamingAPImercredi 15 mai 13
  106. 106. ArchitectureTwitterRiverTwitterStreamingAPI$ curl -XPUT localhost:9200/_river/twitter/_meta -d {"type" : "twitter","twitter" : {"user" : "twitter_user","password" : "twitter_password","filter" : { "tracks" : ["elasticsearch"] }}}mercredi 15 mai 13
  107. 107. ArchitectureTwitterRiverTwitterStreamingAPIChrome$ curl -XPUT localhost:9200/_river/twitter/_meta -d {"type" : "twitter","twitter" : {"user" : "twitter_user","password" : "twitter_password","filter" : { "tracks" : ["elasticsearch"] }}}mercredi 15 mai 13
  108. 108. Démonstrationhttp://onemilliontweetmap.com/http://www.scrutmydocs.orgmercredi 15 mai 13
  109. 109. Démonstrationhttp://onemilliontweetmap.com/http://www.scrutmydocs.orgmercredi 15 mai 13
  110. 110. ArchitectureUn peu plus de technique : partitions / réplications / scalabilitémercredi 15 mai 13
  111. 111. Lexiquemercredi 15 mai 13
  112. 112. Lexique• Nœud (node) : Une instance dElasticsearch(~ machine ?)mercredi 15 mai 13
  113. 113. Lexique• Nœud (node) : Une instance dElasticsearch(~ machine ?)• Cluster : Un ensemble de nœudsmercredi 15 mai 13
  114. 114. Lexique• Nœud (node) : Une instance dElasticsearch(~ machine ?)• Cluster : Un ensemble de nœuds• Partition (shard) : permet de découper unindex en plusieurs parties pour y distribuerles documentsmercredi 15 mai 13
  115. 115. Lexique• Nœud (node) : Une instance dElasticsearch(~ machine ?)• Cluster : Un ensemble de nœuds• Partition (shard) : permet de découper unindex en plusieurs parties pour y distribuerles documents• Réplication (replica) : recopie d’unepartition en une ou plusieurs copies danslensemble du clustermercredi 15 mai 13
  116. 116. Créons un indexClusterNœud 1ClientCURLmercredi 15 mai 13
  117. 117. Créons un indexClusterNœud 1Shard 0Shard 1réplication non respectéeClientCURL$ curl -XPUT localhost:9200/twitter -d {"index" : {"number_of_shards" : 2,"number_of_replicas" : 1}}mercredi 15 mai 13
  118. 118. Créons un indexClusterNœud 2Shard 0Shard 1Nœud 1Shard 0Shard 1réplication respectéeClientCURL$ curl -XPUT localhost:9200/twitter -d {"index" : {"number_of_shards" : 2,"number_of_replicas" : 1}}mercredi 15 mai 13
  119. 119. Réallocation dynamiqueClusterNœud 1Shard 1Nœud 2Shard 0Shard 1Shard 0mercredi 15 mai 13
  120. 120. Réallocation dynamiqueClusterNœud 3Nœud 1Shard 1Nœud 2Shard 0Shard 1Shard 0 Shard 0mercredi 15 mai 13
  121. 121. Réallocation dynamiqueClusterNœud 3Nœud 1Shard 1Nœud 2Shard 0Shard 1Shard 0 Shard 0mercredi 15 mai 13
  122. 122. Réallocation dynamiqueClusterNœud 3Nœud 1Shard 1Nœud 2Shard 1Shard 0 Shard 0mercredi 15 mai 13
  123. 123. Réallocation dynamiqueClusterNœud 3Nœud 1Shard 1Nœud 2Shard 1Shard 0Shard 1Shard 0mercredi 15 mai 13
  124. 124. Réallocation dynamiqueClusterNœud 3Nœud 1Shard 1Nœud 2Shard 1Shard 0Nœud 4Shard 1Shard 0mercredi 15 mai 13
  125. 125. Réallocation dynamiqueClusterNœud 3Nœud 1Shard 1Nœud 2Shard 1Shard 0Nœud 4Shard 1Shard 0mercredi 15 mai 13
  126. 126. Réallocation dynamiqueClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0Nœud 4Shard 1Le tuning, cest trouver le bon équilibre entre lenombre de nodes, shards et replicas !Shard 0mercredi 15 mai 13
  127. 127. Indexons un document$ curl -XPUT localhost:9200/twitter/tweet/1 -d {"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad",...}ClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1mercredi 15 mai 13
  128. 128. Indexons un document$ curl -XPUT localhost:9200/twitter/tweet/1 -d {"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad",...}ClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1mercredi 15 mai 13
  129. 129. Indexons un document$ curl -XPUT localhost:9200/twitter/tweet/1 -d {"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad",...}ClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1Doc1mercredi 15 mai 13
  130. 130. Indexons un document$ curl -XPUT localhost:9200/twitter/tweet/1 -d {"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad",...}ClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1Doc1mercredi 15 mai 13
  131. 131. Indexons un 2èmedocument$ curl -XPUT localhost:9200/twitter/tweet/2 -d {"text": "Je fais du bruit pour #elasticsearch à #JUG","created_at": "2012-04-06T21:12:52.000Z","source": "Twitter for iPad",...}ClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1Doc1Doc2mercredi 15 mai 13
  132. 132. Indexons un 2èmedocument$ curl -XPUT localhost:9200/twitter/tweet/2 -d {"text": "Je fais du bruit pour #elasticsearch à #JUG","created_at": "2012-04-06T21:12:52.000Z","source": "Twitter for iPad",...}ClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1Doc1Doc2mercredi 15 mai 13
  133. 133. Indexons un 2èmedocument$ curl -XPUT localhost:9200/twitter/tweet/2 -d {"text": "Je fais du bruit pour #elasticsearch à #JUG","created_at": "2012-04-06T21:12:52.000Z","source": "Twitter for iPad",...}ClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1Doc1Doc2mercredi 15 mai 13
  134. 134. Indexons un 2èmedocument$ curl -XPUT localhost:9200/twitter/tweet/2 -d {"text": "Je fais du bruit pour #elasticsearch à #JUG","created_at": "2012-04-06T21:12:52.000Z","source": "Twitter for iPad",...}ClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1Doc1Doc2Doc2mercredi 15 mai 13
  135. 135. Indexons un 2èmedocument$ curl -XPUT localhost:9200/twitter/tweet/2 -d {"text": "Je fais du bruit pour #elasticsearch à #JUG","created_at": "2012-04-06T21:12:52.000Z","source": "Twitter for iPad",...}ClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1Doc1Doc2Doc2mercredi 15 mai 13
  136. 136. Cherchons !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1Doc1Doc2Doc2mercredi 15 mai 13
  137. 137. Cherchons !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1Doc1Doc2Doc2mercredi 15 mai 13
  138. 138. Cherchons !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1Doc1Doc2Doc2mercredi 15 mai 13
  139. 139. Cherchons !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1Doc1Doc2Doc2mercredi 15 mai 13
  140. 140. Cherchons !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1Doc1Doc2Doc2{"took" : 24,"timed_out" : false,"_shards" : { "total" : 5, "successful" : 5, "failed" : 0 },"hits" : {"total" : 2,"max_score" : 0.227,"hits" : [ {"_index" : "twitter","_type" : "tweet","_id" : "1","_score" : 0.227, "_source" : { ... }}, {"_index" : "twitter","_type" : "tweet","_id" : "2","_score" : 0.152, "_source" : { ... }} ]}mercredi 15 mai 13
  141. 141. Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1Doc1Doc2Doc2mercredi 15 mai 13
  142. 142. Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1Doc1Doc2Doc2mercredi 15 mai 13
  143. 143. Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0Nœud 4Shard 1ClientCURLDoc1Doc2Doc2Doc1mercredi 15 mai 13
  144. 144. Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0ClientCURLDoc1Doc2Doc1mercredi 15 mai 13
  145. 145. Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0ClientCURLDoc1Doc2Doc1mercredi 15 mai 13
  146. 146. Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0ClientCURLDoc1Doc1Doc2mercredi 15 mai 13
  147. 147. Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0ClientCURLDoc1Doc1Doc2mercredi 15 mai 13
  148. 148. Cherchons encore !$ curl localhost:9200/twitter/_search?q=elasticsearchClusterNœud 3Nœud 1 Nœud 2Shard 1Shard 0 Shard 0ClientCURLDoc1Doc1Doc2{"took" : 24,"timed_out" : false,"_shards" : { "total" : 5, "successful" : 5, "failed" : 0 },"hits" : {"total" : 2,"max_score" : 0.227,"hits" : [ {"_index" : "twitter","_type" : "tweet","_id" : "1","_score" : 0.227, "_source" : { ... }}, {"_index" : "twitter","_type" : "tweet","_id" : "2","_score" : 0.152, "_source" : { ... }} ]}mercredi 15 mai 13
  149. 149. La percolationOu la recherche inverséemercredi 15 mai 13
  150. 150. Usage courant d’unmoteur de recherche• J’indexe un document• Je cherche de temps en temps si undocument m’intéresse• Avec de la chance, il sera bien placé auniveau pertinence dans les résultats.Sinon, il passe inaperçu !mercredi 15 mai 13
  151. 151. La recherche inversée• Enregistrer ses critères de recherche• A chaque document indexé, onrécupère la liste des recherches quicorrespondent• On a un « listener » sur le moteurd’indexation : le percolatormercredi 15 mai 13
  152. 152. Usage du percolator$ curl -XPOST localhost:9200/_percolator/twitter/dadoonet -d ’{"query" : { "term" : { "user.screen_name" : "dadoonet" } }}’$ curl -XPOST localhost:9200/_percolator/twitter/elasticsearch -d ’{"query" : { "match" : { "hashtag.text" : "elasticsearch" } }}’$ curl -XPOST localhost:9200/_percolator/twitter/mycomplexquery -d ’{"query" : {"bool" : {"must" : {"term" : { "user" : "kimchy" }},"must_not" : {"range" : {"age" : { "from" : 10, "to" : 20 }}},"should" : [{"term" : { "tag" : "wow" }},{"match" : { "tag" : "elasticsearch is cool" }}]}}}’mercredi 15 mai 13
  153. 153. Usage du percolatormercredi 15 mai 13
  154. 154. Usage du percolator$ curl -XPUT localhost:9200/twitter/tweet/1&percolate=* -d {"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad","truncated": false,"retweet_count": 0,"hashtag": [ { "text": "elasticsearch", "start": 27, "end": 40 },{ "text": "JUG", "start": 47, "end": 55 } ],"user": { "id": 51172224,"name": "David Pilato","screen_name": "dadoonet", "location": "France","description": "Soft Architect, Project Manager, SeniorDevelopper.rnAt this time, enjoying NoSQL world : CouchDB, ElasticSearch.rnDeeJay 4 times a year, just for fun !" }}mercredi 15 mai 13
  155. 155. Usage du percolator$ curl -XPUT localhost:9200/twitter/tweet/1&percolate=* -d {"text": "Bienvenue à la conférence #elasticsearch pour #JUG","created_at": "2012-04-06T20:45:36.000Z","source": "Twitter for iPad","truncated": false,"retweet_count": 0,"hashtag": [ { "text": "elasticsearch", "start": 27, "end": 40 },{ "text": "JUG", "start": 47, "end": 55 } ],"user": { "id": 51172224,"name": "David Pilato","screen_name": "dadoonet", "location": "France","description": "Soft Architect, Project Manager, SeniorDevelopper.rnAt this time, enjoying NoSQL world : CouchDB, ElasticSearch.rnDeeJay 4 times a year, just for fun !" }}{"ok": true,"_index": "twitter","_type": "tweet","_id": "1","matches": ["dadoonet","elasticsearch"]}mercredi 15 mai 13
  156. 156. Tout doit êtreindexé ?Analyse et mappingmercredi 15 mai 13
  157. 157. The lazy dog...mercredi 15 mai 13
  158. 158. The quick brown foxjumped over the lazy DogThe lazy dog...mercredi 15 mai 13
  159. 159. The quick brown foxjumped over the lazy dogThe quick brown foxjumped over the lazy DogThe lazy dog...mercredi 15 mai 13
  160. 160. Analyseur standard$ curl -XPOST localhost:9200/test/_analyze?analyzer=standard&pretty=1 -dThe quick brown fox jumped over the lazy Dogmercredi 15 mai 13
  161. 161. Analyseur standard$ curl -XPOST localhost:9200/test/_analyze?analyzer=standard&pretty=1 -dThe quick brown fox jumped over the lazy Dog{"tokens" : [ {"token" : "quick","start_offset": 4, "end_offset": 9, "type": "<ALPHANUM>", "position": 2}, {"token" : "brown","start_offset": 10, "end_offset": 15, "type": "<ALPHANUM>", "position": 3}, {"token" : "fox","start_offset": 16, "end_offset": 19, "type": "<ALPHANUM>", "position": 4}, {"token": "jumped","start_offset": 20, "end_offset": 26, "type": "<ALPHANUM>", "position": 5}, {"token": "over","start_offset": 27, "end_offset": 31, "type": "<ALPHANUM>", "position": 6}, {"token" : "lazy","start_offset": 36, "end_offset": 40, "type": "<ALPHANUM>", "position": 8}, {"token" : "dog","start_offset": 41, "end_offset": 44, "type": "<ALPHANUM>", "position": 9} ] }mercredi 15 mai 13
  162. 162. Analyseur whitespace$ curl -XPOST localhost:9200/test/_analyze?analyzer=whitespace&pretty=1 -dThe quick brown fox jumped over the lazy Dogmercredi 15 mai 13
  163. 163. Analyseur whitespace$ curl -XPOST localhost:9200/test/_analyze?analyzer=whitespace&pretty=1 -dThe quick brown fox jumped over the lazy Dog{"tokens" : [ {"token" : "The", ...}, {"token" : "quick", ...}, {"token" : "brown", ...}, {"token" : "fox", ...}, {"token" : "jumped", ...}, {"token" : "over", ...}, {"token" : "the", ...}, {"token" : "lazy", ...}, {"token" : "Dog", ...} ] }mercredi 15 mai 13
  164. 164. Un analyseurUn ensemblede tokenizers etde filtresmercredi 15 mai 13
  165. 165. Un tokenizer• Découpe une chaine en « mots » ettransforme :• whitespace tokenizer :"the dog!" -> "the", "dog!"• standard tokenizer :"the dog!" -> "the", "dog"mercredi 15 mai 13
  166. 166. Un filtre• Supprime ou transforme un token :• asciifolding filter :éléphant -> elephant• stemmer filter (french) :elephants -> "eleph"cheval -> "cheval"chevaux -> "cheval"• phonetic (plugin) :quick -> "Q200"quik -> "Q200"mercredi 15 mai 13
  167. 167. Analyzer"analysis":{"analyzer":{"francais":{"type":"custom","tokenizer":"standard","filter":["lowercase", "stop_francais", "fr_stemmer", "asciifolding", "elision"]}},"filter":{"stop_francais":{"type":"stop","stopwords":["_french_", "twitter"]},"fr_stemmer" : {"type" : "stemmer","name" : "french"},"elision" : {"type" : "elision","articles" : ["l", "m", "t", "qu", "n", "s", "j", "d"]}}}mercredi 15 mai 13
  168. 168. Mapping"type1" : {"properties" : {"text1" : { "type" : "string", "analyzer" : "simple" },"text2" : { "type" : "string", "index_analyzer" : "simple","search_analyzer" : "standard"},"text3" : {"type" : "multi_field","fields" : {"text3" : {"type" : "string","analyzer" : "standard"},"ngram" : {"type" : "string","analyzer" : "ngram"},"soundex" : {"type" : "string","analyzer" : "soundex"}}}}}mercredi 15 mai 13
  169. 169. Les types• string• integer / long• float / double• boolean• null• array• objects• multi_field• ip• geo_point• geo_shape• binary• attachment (plugin)mercredi 15 mai 13
  170. 170. Champs spéciaux• _all (et include_in_all)• _source• _ttl• parent / child• nestedmercredi 15 mai 13
  171. 171. Autres fonctionnalités• highlighting• scoring• sort• explain• multi get / multi search• bulkmercredi 15 mai 13
  172. 172. Autres fonctionnalités• highlighting• scoring• sort• explain• multi get / multi search• bulkmercredi 15 mai 13
  173. 173. DémonstrationsCURL est ton ami !JAVA est aussi ton ami !mercredi 15 mai 13
  174. 174. La communauté~80 contributeurs directs au projet (+ de 4000 watchers et + de 840 forks)mercredi 15 mai 13
  175. 175. La communauté~250 inscrits sur la mailing list, 70 messages / mois, ~400 followers, ~200 sur meetupmercredi 15 mai 13
  176. 176. mercredi 15 mai 13
  177. 177. Rejoignez le mouvement !@ElasticsearchFRQuestions ?Slides sur http://fr.slideshare.net/dadoonet Sources sur https://github.com/elasticsearchfr/talkswww.elasticsearch.frPosez aussi vos questions sur elasticsearch-fr@googlegroups.cominprogressProchaines rencontres sur http://www.meetup.com/elasticsearchfr/mercredi 15 mai 13

×