Elasticsearch - Devoxx France 2012

A presentation at Devoxx France 2012 in April 2012 in Paris, France by David Pilato

Slide 1

Slide 1

Elasticsearch : moteur de recherche taillé pour le cloud par David Pilato @dadoonet et @elasticsearchfr 1

Slide 2

Slide 2

{ “speaker” : “David Pilato” } $ curl http://localhost:9200/devoxx/speaker/dpilato { } “nom” : “David Pilato”, “jobs” : [ { “boite” : “SRA Europe (SSII)”, “mission” : “bon à tout faire”, “duree” : 3 }, { “boite” : “SFR”, “mission” : “touche à tout”, “duree” : 3 }, { “boite” : “e-Brands / Vivendi”, “mission” : “chef de projets”, “duree” : 4 }, { “boite” : “DGDDI (douane)”, “mission” : “mouton à 5 pattes”, “duree” : 7 } ], “passions” : [ “famille”, “job”, “deejay” ], “blog” : “http://dev.david.pilato.fr/”, “twitter” : [ “@dadoonet”, “@elasticsearchfr” ], “email” : “david@pilato.fr” 2

Slide 3

Slide 3

Abstract • Un moteur ? Pourquoi faire ? • Elasticsearch : une solution simple, complète, performante • Et si on indexait Twitter ? Faites du bruit sur @DevoxxFR avec le hashtag #elasticsearch ! 3

Slide 4

Slide 4

Un moteur ? Pour quoi faire ? LE BESOIN 4

Slide 5

Slide 5

Cas d’école « SQL old school » Un document dans une base de données : doc • Un attribut date : 19/04/2012 date • Un attribut codifié pays : FR pays commentaire • Correspondant à la table d’association code/libellé • Code : FR • Libellé : France • Un attribut commentaire : “J’observe une erreur de saisie dans la désignation commerciale du produit. Songer à téléphoner à David.” Moteur Elasticsearch Rivers Facets Demo Architecture Communauté pays code libelle 5

Slide 6

Slide 6

Cas d’école « SQL old school » • Cherche moi un document de décembre 2011 portant sur la france et contenant saisie et david • En SQL : SELECT doc., pays. FROM doc, pays WHERE doc.pays_code = pays.code AND doc.date_doc > to_date(‘2011-12’, ‘yyyy-mm’) AND doc.date_doc < to_date(‘2012-01’, ‘yyyy-mm’) AND lower(pays.libelle) = ‘france’ AND lower(doc.commentaire) LIKE ‘%saisie%’ AND lower(doc.commentaire) LIKE ‘%david%’; Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 6

Slide 7

Slide 7

Performances du like ‘%’ Voir aussi : http://www.cestpasdur.com/2012/04/01/elasticsearch-vs-mysql-recherche Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 7

Slide 8

Slide 8

C’est quoi un moteur ? • Un moteur de recherche est composé de : • un moteur d’indexation de documents • un moteur de recherche sur les index • De fait, un moteur de recherche est énormément plus rapide qu’une base de données pour faire des recherches : c’est son métier ! Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 8

Slide 9

Slide 9

Your Data, your Search ! ELASTICSEARCH 9

Slide 10

Slide 10

Elasticsearch • Moteur de recherche pour la génération NoSQL • Basé sur le standard Apache Lucene • Masque la complexité Java/Lucene à l’aide de services standards HTTP / RESTful / JSON • Utilisable à partir de n’importe quelle technologie • Ajoute la couche cloud manquante à Lucene • C’est un moteur, pas une interface graphique ! Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 10

Slide 11

Slide 11

Points clés • Simple ! En quelques minutes (Zero Conf), on dispose d’un moteur complet prêt à recevoir nos documents à indexer et à faire des recherches. • Efficace ! Il suffit de démarrer des nœuds Elasticsearch pour bénéficier immédiatement de la réplication, de l’équilibrage de charge. • Puissant ! Basé sur Lucene, il en parallélise les traitements pour donner des temps de réponse acceptables (en général inférieurs à 100ms) • Complet ! Beaucoup de fonctionnalités : analyse et facettes, percolation, rivières, plugins, … Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 11

Slide 12

Slide 12

Ranger ses données • Document : Un objet représentant les données (au sens NoSQL). Penser “recherche”, c’est oublier le SGBDR et penser “Documents” Un tweet { “text”: “Bienvenue à la conférence #elasticsearch pour #devoxxfr”, “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”: “devoxxfr”, “start”: 47, “end”: 55 } ], “user”: { “id”: 51172224, “name”: “David Pilato”, “screen_name”: “dadoonet”, “location”: “France”, “description”: “Soft Architect, Project Manager, Senior Developper.\r\nAt this time, enjoying NoSQL world : CouchDB, ElasticSearch.\r\nDeeJay 4 times a year, just for fun !” } } • Type : Regroupe des documents de même type • Index : Espace logique de stockage des documents dont les types sont fonctionnellement communs Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 12

Slide 13

Slide 13

Interagir avec Elasticsearch 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 -XGET http://localhost:9200/twitter/tweet/_search • curl -XGET http://localhost:9200/twitter/_search • curl -XGET http://localhost:9200/_search Meta données Elasticsearch • curl -XGET http://localhost:9200/twitter/_status Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 13

Slide 14

Slide 14

Indexons un document $ curl -XPUT localhost:9200/twitter/tweet/1 -d ’ { “text”: “Bienvenue à la conférence #elasticsearch pour #devoxxfr”, “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”: “devoxxfr”, “start”: 47, “end”: 55 } ], “user”: { “id”: 51172224, “name”: “David Pilato”, “screen_name”: “dadoonet”, “location”: “France”, “description”: “Soft Architect, Project Manager, Senior Developper.\r\nAt this time, enjoying NoSQL world : CouchDB, ElasticSearch.\r\nDeeJay 4 times a year, just for fun !” } }’ { } “ok”:true, “_index”:”twitter”, “_type”:”tweet”, “_id”:”1” Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 14

Slide 15

Slide 15

Cherchons un document $ curl localhost:9200/twitter/tweet/_search?q=elasticsearch { Nb de documents Document Coordonné source es “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 #devoxxfr”, “created_at”: “2012-04-06T20:45:36.000Z”, “source”: “Twitter for iPad”, […] } } ] } Pertinence } Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 15

Slide 16

Slide 16

Les résultats de recherche • Elasticsearch ne renvoie que les 10 premiers résultats (même sur plusieurs millions) • Elasticsearch permet ensuite de se “balader” dans les résultats $ curl “localhost:9200/twitter/tweet/_search?q=elasticsearch&from=10&size=10” • La pertinence est calculée suivant le nombre d’occurrences plus ou moins exactes de chaque terme dans un document $ curl “localhost:9200/twitter/tweet/_search?q=elasticsearch&explain=true” Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 16

Slide 17

Slide 17

Quelques types de recherche Langage QueryDSL pour les recherches avancées Type Match All QueryString Description Recherche tout le contenu (pratique avec des filtres) Recherche avec analyse, jokers (syntaxe Lucene possible* +, -, FROM, TO, ^) Term Recherche d’un terme sans analyse préalable Text Recherche d’un texte avec analyse (par défaut OR sur chaque token) Wildcard Bool Recherche avec joker (*, ?) Recherche multi-critères (MUST, MUST NOT, SHOULD) Range Recherche intervalle (>, >=, <, <=) Prefix Utile pour faire de l’autocomplétion Filtered Filtrage (couplage de filtres et de queries) Fuzzy like this Permet des recherches par vraisemblance de termes More like this Permet de trouver des documents avec un minimum de termes

  • http://lucene.apache.org/core/old_versioned_docs/versions/3_5_0/queryparsersyntax.html Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 17

Slide 18

Slide 18

Ou “La vie est un long fleuve tranquille !” LA COLLECTE AUTOMATIQUE DE DONNÉES 18

Slide 19

Slide 19

La collecte Doc Moteur Elasticsearch Rivers Stockage Données Facets Demo Architecture Communauté 19

Slide 20

Slide 20

La collecte Doc Stockage Données Doc Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 20

Slide 21

Slide 21

La collecte Stockage Données Doc Moteur Elasticsearch Rivers Facets Demo Architecture Communauté Doc 21

Slide 22

Slide 22

La collecte Doc Stockage Données Doc Doc Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 22

Slide 23

Slide 23

La collecte Stockage Données Doc Doc Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 23

Slide 24

Slide 24

La collecte Stockage Données Doc Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 24

Slide 25

Slide 25

Rivers • CouchDB River MongoDB River Wikipedia River Twitter River RabbitMQ River • RSS River • Dick Rivers • • • • Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 25

Slide 26

Slide 26

La puissance des facettes ! Faites parler vos données en les regardant sous différentes facettes ! ANALYSE DES RÉSULTATS (EN TEMPS QUASI RÉEL) 26

Slide 27

Slide 27

Des tweets Les facettes ID Username Date Hashtags 1 dadoonet 2012-04-18 1 2 devoxxfr 2012-04-18 5 3 elasticsearchfr 2012-04-18 2 4 dadoonet 2012-04-18 2 5 devoxxfr 2012-04-18 6 6 elasticsearchfr 2012-04-19 3 7 dadoonet 2012-04-19 3 8 devoxxfr 2012-04-19 7 9 elasticsearchfr 2012-04-20 4 Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 27

Slide 28

Slide 28

Facette “Term” Username Date Hashtags dadoonet 2012-04-18 1 devoxxfr 2012-04-18 5 elasticsearchfr 2012-04-18 Username 2 Count dadoonet 2012-04-18 dadoonet2 3 devoxxfr 2012-04-18 devoxxfr6 3 elasticsearchfr 2012-04-19 elasticsearchfr 3 dadoonet 2012-04-19 3 devoxxfr 2012-04-19 7 elasticsearchfr 2012-04-20 4 Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 3 28

Slide 29

Slide 29

Facette “Term” } ID 1 2 3 4 5 6 7 8 9 “facets” : { “users” : { “terms” : {“field” : “username”} } Username Date : { Hashtags “facets” “users” : { dadoonet 2012-04-18 1 “_type” : “terms”, devoxxfr 2012-04-18 5 “missing” : 0, elasticsearchfr 2012-04-18 2 “total”: 9, dadoonet 2012-04-18 2 “other”: 0, “terms” : [ devoxxfr 2012-04-18 6 { “term” : “dadoonet”, “count” : 3 }, elasticsearchfr 2012-04-19 3 { “term” : “devoxxfr”, “count” : 3 }, dadoonet 2012-04-19 3 { “term” : “elasticsearchfr”, “count” : 3 } devoxxfr 2012-04-19 ] 7 } elasticsearchfr 2012-04-20 4 Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 29

Slide 30

Slide 30

Facette “Date Histogram” ame Date Hashtags onet 2012-04-18 1 xxfr 2012-04-18 5 2012-04-18 2 onet 2012-04-18 2 xxfr 2012-04-18 6 2012-04-19 3 onet 2012-04-19 3 xxfr 2012-04-19 7 2012-04-20 4 archfr archfr archfr Moteur Elasticsearch Rivers Facets Demo Par mois Date 2012-04 Count 9 Par jour Date 2012-04-18 2012-04-19 2012-04-20 Architecture Communauté Count 5 3 1 30

Slide 31

Slide 31

Facette “Date Histogram” ame Date onet 2012-04-18 xxfr 2012-04-18 archfr 2012-04-18 onet 2012-04-18 xxfr 2012-04-18 archfr 2012-04-19 onet 2012-04-19 xxfr 2012-04-19 archfr “facets” : { “perday” : { “date_histogram” : { “field” : “date”, “interval” : “day” Hashtags } }1 } 5 2012-04-20 Moteur Elasticsearch Rivers Facets 2 “facets” : { 2 “perday” : { “_type” : “date_histogram”, 6 “entries”: [ 3 { “time”: 1334700000000, “count”: 5 }, 3 { “time”: 1334786400000, “count”: 3 }, 7 { “time”: 1334872800000, “count”: 1 } ] } 4 } Demo Architecture Communauté 31

Slide 32

Slide 32

Facette “Ranges” Hashtags 8 1 8 5 8 2 8 2 8 6 9 3 9 3 9 7 0 4 Moteur Elasticsearch Rivers Ranges Count Min Max Moy Total x<3 3 1 2 1.667 5 3 <= x < 5 3 3 4 3.333 10 x >= 5 3 5 7 6 18 Facets Demo Architecture Communauté 32

Slide 33

Slide 33

Facette “Ranges” Hashtags 8 1 8 5 8 2 8 2 8 6 9 3 9 3 9 7 0 4 “facets” : { “hashtags” : { “range” : { “field” : “hashtags”, “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 } ] } } Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 33

Slide 34

Slide 34

Usage “site marchand” Ranges Term Term Ranges Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 34

Slide 35

Slide 35

La navigation par facettes Critère fixe Term Ranges Date histogram Résultats Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 35

Slide 36

Slide 36

La navigation par facettes Critères Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 36

Slide 37

Slide 37

Analyse temps-réel des données • Faire un matchAll sur l’ensemble des données • Actualiser toutes les x secondes • Indexer en même temps les nouvelles données Date histogram Term Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 37

Slide 38

Slide 38

Avons-nous fait du bruit ? DÉMONSTRATION 38

Slide 39

Slide 39

Démonstration : architecture Chrome Twitter River Twitter Streaming API $ curl -XPUT localhost:9200/_river/twitter/_meta -d ’ { “type” : “twitter”, “twitter” : { “user” : “twitter_user”, “password” : “twitter_passowrd”, “filter” : { “tracks” : [“devoxxfr”] } } }’ Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 39

Slide 40

Slide 40

Un peu plus de technique : partitions / réplications / scalabilité ARCHITECTURE 40

Slide 41

Slide 41

Lexique • Nœud (node) : Une instance d’Elasticsearch (~ machine ?) • Cluster : Un ensemble de nœuds • Partition (shard) : permet de découper un index en plusieurs parties pour y distribuer les documents • Réplication (replica) : recopie d’une partition en une ou plusieurs copies dans l’ensemble du cluster • Partition primaire (primary shard) : partition élue “principale” dans l’ensemble du cluster. C’est là que se fait l’indexation par Lucene. Il n’y en a qu’une seule par shard dans l’ensemble du cluster. • Partition secondaire (secondary shard) : partitions secondaires stockant les replicas des partitions primaires. Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 41

Slide 42

Slide 42

Créons un index $ curl -XPUT localhost:9200/twitter -d ‘{ “index” : { “number_of_shards” : 2, “number_of_replicas” : 1 } }’ Cluster Nœud Nœud11 Nœud 2 Shard Shard00 (primary) (primary) Shard 0 (replica) Shard Shard11 (primary) (replica) Shard 1 (primary) réplication réplication non respectée respectée Client CURL Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 42

Slide 43

Slide 43

Réallocation dynamique Cluster Moteur Elasticsearch Rivers Nœud 1 Nœud 2 Shard 0 (primary) Shard 0 (replica) Shard 1 (replica) Shard 1 (primary) Facets Demo Architecture Communauté Nœud 3 43

Slide 44

Slide 44

Réallocation dynamique Cluster Moteur Elasticsearch Rivers Nœud 1 Nœud 2 Nœud 3 Shard 0 (primary) Shard 0 (replica) Shard 0 (replica) Shard 1 (replica) Shard 1 (primary) Facets Demo Architecture Communauté Nœud 4 44

Slide 45

Slide 45

Réallocation dynamique Cluster Nœud 1 Nœud 2 Shard 0 (primary) Shard 1 (replica) Nœud 3 Nœud 4 Shard 0 (replica) Shard 1 (primary) Shard 1 (replica) Le tuning, c’est trouver le bon équilibre entre le nombre de nodes, shards et replicas ! Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 45

Slide 46

Slide 46

Indexons un document Cluster Nœud 1 Nœud 2 Shard 0 (primary) Nœud 3 Nœud 4 Shard 0 (replica) Shard 1 (primary) Doc 1 Client CURL Shard 1 (replica) $ curl -XPUT localhost:9200/twitter/tweet/1 -d ’ { “text”: “Bienvenue à la conférence #elasticsearch pour #devoxxfr”, “created_at”: “2012-04-06T20:45:36.000Z”, “source”: “Twitter for iPad”, … }’ Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 46

Slide 47

Slide 47

Indexons un document Cluster Nœud 1 Nœud 2 Shard 0 Doc (primary) 1 Nœud 3 Nœud 4 Shard 0 (replica) Shard 1 (primary) Client CURL Shard 1 (replica) $ curl -XPUT localhost:9200/twitter/tweet/1 -d ’ { “text”: “Bienvenue à la conférence #elasticsearch pour #devoxxfr”, “created_at”: “2012-04-06T20:45:36.000Z”, “source”: “Twitter for iPad”, … }’ Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 47

Slide 48

Slide 48

Indexons un document Cluster Nœud 1 Nœud 2 Shard 0 Doc (primary) 1 Nœud 3 Nœud 4 Shard 0 Doc (replica) 1 Shard 1 (primary) Client CURL Shard 1 (replica) $ curl -XPUT localhost:9200/twitter/tweet/1 -d ’ { “text”: “Bienvenue à la conférence #elasticsearch pour #devoxxfr”, “created_at”: “2012-04-06T20:45:36.000Z”, “source”: “Twitter for iPad”, … }’ Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 48

Slide 49

Slide 49

Indexons un 2ème document Cluster Nœud 1 Nœud 2 Shard 0 Doc (primary) 1 Nœud 4 Shard 0 Doc (replica) 1 Shard 1 (primary) Doc 2 Nœud 3 Client CURL Shard 1 (replica) $ curl -XPUT localhost:9200/twitter/tweet/2 -d ’ { “text”: “Je fais du bruit pour #elasticsearch à #devoxxfr”, “created_at”: “2012-04-06T21:12:52.000Z”, “source”: “Twitter for iPad”, … }’ Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 49

Slide 50

Slide 50

Indexons un 2ème document Cluster Nœud 1 Nœud 2 Shard 0 Doc (primary) 1 Nœud 3 Nœud 4 Shard 0 Doc (replica) 1 Shard 1 (primary) Doc 2 Client CURL Shard 1 (replica) $ curl -XPUT localhost:9200/twitter/tweet/2 -d ’ { “text”: “Je fais du bruit pour #elasticsearch à #devoxxfr”, “created_at”: “2012-04-06T21:12:52.000Z”, “source”: “Twitter for iPad”, … }’ 50

Slide 51

Slide 51

Indexons un 2ème document Cluster Nœud 1 Nœud 3 Nœud 2 Shard 0 Doc (primary) 1 Nœud 4 Shard 0 Doc (replica) 1 Shard 1 (primary) Client CURL Doc 2 Shard 1 (replica) $ curl -XPUT localhost:9200/twitter/tweet/2 -d ’ { “text”: “Je fais du bruit pour #elasticsearch à #devoxxfr”, “created_at”: “2012-04-06T21:12:52.000Z”, “source”: “Twitter for iPad”, … }’ Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 51

Slide 52

Slide 52

Indexons un 2ème document Cluster Nœud 1 Nœud 3 Nœud 2 Shard 0 Doc (primary) 1 Nœud 4 Shard 0 Doc (replica) 1 Shard 1 (primary) Client CURL Doc 2 Shard 1 (replica) Doc 2 $ curl -XPUT localhost:9200/twitter/tweet/2 -d ’ { “text”: “Je fais du bruit pour #elasticsearch à #devoxxfr”, “created_at”: “2012-04-06T21:12:52.000Z”, “source”: “Twitter for iPad”, … }’ Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 52

Slide 53

Slide 53

Cherchons Cluster Nœud 1 Nœud 3 Nœud 2 Shard 0 Doc (primary) 1 Shard 0 Doc (replica) 1 Shard 1 (primary) Client CURL Moteur Elasticsearch Rivers Facets Demo Nœud 4 Doc 2 Shard 1 (replica) Doc 2 $ curl localhost:9200/twitter/_search?q=elasticsearch Architecture Communauté 53

Slide 54

Slide 54

Cherchons Cluster Nœud 1 Nœud 2 Shard 0 (primary) Doc 1 Facets Demo Nœud 4 Shard 0 Doc (replica) 1 Shard 1 (primary) Doc 2 Client CURL Moteur Elasticsearch Rivers Nœud 3 Shard 1 (replica) Doc 2 $ curl localhost:9200/twitter/_search?q=elasticsearch Architecture Communauté 54

Slide 55

Slide 55

Cherchons { Nœud 1 Shard 0 (primary) Doc 1 Moteur Elasticsearch Rivers Facets Demo Doc 2 Client CURL Cluster “took” : 24, “timed_out” : false, Nœud 3 Nœud 2 Nœud 4 “_shards” : { “total” : 5, “successful” : 5, “failed” : 0 }, “hits” : { Shard 0 Doc “total” : 2, (replica) 1 “max_score” : 0.227, Shard 1 Shard 1 Doc “hits” : [ { 2 (primary) (replica) “_index” : “twitter”, “_type” : “tweet”, “_id” : “1”, “_score” : 0.227, “_source” : { … } }, { “_index” : “twitter”, “_type” : “tweet”, $ curl “_id” localhost:9200/twitter/_search?q=elasticsearch : “2”, “_score” : 0.152, “_source” : { … } } ] } } Architecture Communauté 55

Slide 56

Slide 56

Cherchons encore Cluster Nœud 1 Nœud 3 Nœud 2 Shard 0 Doc (primary) 1 Shard 0 Doc (replica) 1 Shard 1 (primary) Client CURL Moteur Elasticsearch Rivers Facets Demo Nœud 4 Doc 2 Shard 1 (replica) Doc 2 $ curl localhost:9200/twitter/_search?q=elasticsearch Architecture Communauté 56

Slide 57

Slide 57

Cherchons encore Cluster Nœud 1 Shard 0 Doc (primary) 1 Client CURL Facets Demo Nœud 4 Shard 0 (replica) Doc 1 Shard 1 (primary) Moteur Elasticsearch Rivers Nœud 3 Nœud 2 Doc 2 Doc 2 Shard 1 (replica) $ curl localhost:9200/twitter/_search?q=elasticsearch Architecture Communauté 57

Slide 58

Slide 58

Cherchons encore Cluster Nœud 1 Nœud 2 Shard 0 Doc (primary) 1 Doc 1 Shard 0 (replica) Shard 1 (primary) (replica) Doc 2 Client CURL Moteur Elasticsearch Rivers Facets Demo Nœud 3 $ curl localhost:9200/twitter/_search?q=elasticsearch Architecture Communauté 58

Slide 59

Slide 59

Cherchons encore { Nœud 1 Shard 0 Doc (primary) 1 Doc 2 Doc 1 Client CURL Moteur Elasticsearch Rivers Facets Demo Cluster “took” : 24, “timed_out” : false, Nœud 3 Nœud 2 “_shards” : { “total” : 5, “successful” : 5, “failed” : 0 }, “hits” : { Shard 0 “total” : 2, (replica) “max_score” : 0.227, Shard 1 Shard 1 “hits” : [ { (replica) (primary) “_index” : “twitter”, “_type” : “tweet”, “_id” : “1”, “_score” : 0.227, “_source” : { … } }, { “_index” : “twitter”, “_type” : “tweet”, $ curl “_id” localhost:9200/twitter/_search?q=elasticsearch : “2”, “_score” : 0.152, “_source” : { … } } ] } } Architecture Communauté 59

Slide 60

Slide 60

Elasticsearch : la communauté ~50 contributeurs directs au projet (+ de 2000 watchers et + de 280 forks) Moteur Elasticsearch Rivers Facets Demo Architecture Communauté 60

Slide 61

Slide 61

Rejoignez le mouvement ! @ElasticsearchFR Posez aussi vos questions sur elasticsearch-fr@googlegroups.com QUESTIONS ? Sources du talk sur : https://github.com/dadoonet/talks 61