Elasticsearch - OSDC France 2012

3,777
-1

Published on

Les slides de mon talk le 13 octobre 2012 15h pour OSDC.fr : http://act.osdc.fr/osdc2012fr/talk/4300

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

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

No notes for slide
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • \n
  • Elasticsearch - OSDC France 2012

    1. 1. Elasticsearch. Le moteur de recherche élastique pour tousDavid Pilato, IDEO Technologies, Paris
    2. 2. Qui ?$ curl http://localhost:9200/talk/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" : 8 }, { "boite" : "IDEO Technologies", "mission" : "directeur technique", "duree" : 0 } ], "passions" : [ "famille", "job", "deejay" ], "blog" : "http://dev.david.pilato.fr/", "twitter" : [ "@dadoonet", "@elasticsearchfr", "@scrutmydocs" ], "email" : "david@pilato.fr"}
    3. 3. Qui ?$ curl http://localhost:9200/talk/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" : 8 }, { "boite" : "IDEO Technologies", "mission" : "directeur technique", "duree" : 0 } ], "passions" : [ "famille", "job", "deejay" ], "blog" : "http://dev.david.pilato.fr/", "twitter" : [ "@dadoonet", "@elasticsearchfr", "@scrutmydocs" ], "email" : "david@pilato.fr"}
    4. 4. ScrutMyDocs.org
    5. 5. Pour la démo Faites du bruit sur Twitter avec le hashtag#elasticsearch
    6. 6. SQL Classique Cherche moi un document de décembre 2011 portant sur la france et contenant produit et davidEn SQL :
    7. 7. SQL Classique Cherche moi un document de décembre 2011 portant sur la france et contenant produit et davidEn SQL :SELECT doc.*, pays.*FROM doc, paysWHERE 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 ‘%produit% AND lower(doc.commentaire) LIKE ‘%david%;
    8. 8. Les limites de la recherche SQL• En général, on se limite aux champs figés ou codifiés• Pas de tolérance aux fotes de frappe• Performances désastreuses sur du like % sur des millions de ligne• Plombe les performances de l’insertion• Recherche « google » impossible !
    9. 9. Au final, on obtient • Autrement dit : tu as intérêt à savoir ce que tu cherches ! • Fouiller est interdit !
    10. 10. Un moteur de recherche• 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 !
    11. 11. Elasticsearch
    12. 12. Elasticsearch Your Data, your Search !
    13. 13. 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 !
    14. 14. 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, …
    15. 15. Ranger ses données• Document : Un objet représentant les données (au sens NoSQL). 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 les types sont fonctionnellement communs
    16. 16. Ranger ses données • Document : Un objet représentant les données (au sens NoSQL). Penser "recherche", cest oublier le SGBDR et penser "Documents"{ "text": "Bienvenue à la conférence #elasticsearch pour #ideobar", "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": "ideobar", "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 !" }} • Type : Regroupe des documents de même type • Index : Espace logique de stockage des documents dont les types sont fonctionnellement communs
    17. 17. Ranger ses données • Document : Un objet représentant les données (au sens NoSQL). Penser "recherche", cest oublier le SGBDR et penser "Documents"{ "text": "Bienvenue à la conférence #elasticsearch pour #ideobar", "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": "ideobar", "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 !" }} • Type : Regroupe des documents de même type
    18. 18. Ranger ses données • Document : Un objet représentant les données (au sens NoSQL). Penser "recherche", cest oublier le SGBDR et penser "Documents"{ "text": "Bienvenue à la conférence #elasticsearch pour #ideobar", "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": "ideobar", "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 !" }} • Type : Regroupe des documents de même type • Index : Espace logique de stockage des documents dont les types sont fonctionnellement communs
    19. 19. Interagir avecElasticsearch
    20. 20. Interagir avec Elasticsearch• API REST : http://host:port/[index]/[type]/[_action/id] Méthodes HTTP : GET, POST, PUT, DELETE
    21. 21. 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
    22. 22. 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
    23. 23. 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
    24. 24. 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 -XPOST http://localhost:9200/twitter/tweet/_search
    25. 25. 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 -XPOST http://localhost:9200/twitter/tweet/_search • curl -XPOST http://localhost:9200/twitter/_search
    26. 26. 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 -XPOST http://localhost:9200/twitter/tweet/_search • curl -XPOST http://localhost:9200/twitter/_search • curl -XPOST http://localhost:9200/_search
    27. 27. 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 -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
    28. 28. 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 -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/_shutdown
    29. 29. Indexer$ curl -XPUT localhost:9200/twitter/tweet/1 -d { "text": "Bienvenue à la conférence #elasticsearch pour #ideobar", "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": "ideobar", "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 !" }}
    30. 30. Indexer$ curl -XPUT localhost:9200/twitter/tweet/1 -d { "text": "Bienvenue à la conférence #elasticsearch pour #ideobar", "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": "ideobar", "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 !" }}{ "ok":true, "_index":"twitter", "_type":"tweet", "_id":"1"}
    31. 31. Chercher$ curl localhost:9200/twitter/tweet/_search?q=elasticsearch
    32. 32. 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 #ideobar", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", […] } } ] }}
    33. 33. Chercher $ curl localhost:9200/twitter/tweet/_search?q=elasticsearch{ "took" : 24, Nb de "timed_out" : false, documents "_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 #ideobar", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", […] } } ] }}
    34. 34. 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" : [ { Coordonnées "_index" : "twitter", "_type" : "tweet", "_id" : "1", "_score" : 0.227, "_source" : { "text": "Bienvenue à la conférence #elasticsearch pour #ideobar", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", […] } } ] }}
    35. 35. 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 #ideobar", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", […] } Pertinence } ] }}
    36. 36. Chercher $ curl localhost:9200/twitter/tweet/_search?q=elasticsearch{ "took" : 24, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1, Document "max_score" : 0.227, "hits" : [ { source "_index" : "twitter", "_type" : "tweet", "_id" : "1", "_score" : 0.227, "_source" : { "text": "Bienvenue à la conférence #elasticsearch pour #ideobar", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", […] } } ] }}
    37. 37. Les résultats• Elasticsearch renvoie les 10 premiers résultats. Il fournit l’API permettant de naviguer de page en page (from, size)• Par défaut, le tri est réalisé sur le score de pertinence
    38. 38. Query DSL• Requêtes précises : plutôt que de chercher « à la google », on peut utiliser des critères précis :
    39. 39. Query DSL• Requêtes précises : plutôt que de chercher « à la google », on peut utiliser 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" } } ] } }’
    40. 40. Injecter les données Et au milieu coule une rivière
    41. 41. La collecte
    42. 42. La collecte Stockage Données
    43. 43. La collecteDoc Stockage Données
    44. 44. La collecte Stockage Données Doc
    45. 45. La collecteDoc Stockage Données Doc
    46. 46. La collecte Stockage Données Doc Doc
    47. 47. La collecte Stockage Données Doc Doc
    48. 48. La collecte Stockage Données Doc Doc
    49. 49. La collecte Stockage Données Doc Doc
    50. 50. La collecteDoc Stockage Données Doc Doc
    51. 51. La collecte Stockage Données Doc Doc
    52. 52. La collecte Stockage Données Doc Doc
    53. 53. Quelques Rivers...
    54. 54. Quelques Rivers...• CouchDB River
    55. 55. Quelques Rivers...• CouchDB River• MongoDB River
    56. 56. Quelques Rivers...• CouchDB River• MongoDB River• JDBC River
    57. 57. Quelques Rivers...• CouchDB River• MongoDB River• JDBC River• Wikipedia River
    58. 58. Quelques Rivers...• CouchDB River• MongoDB River• JDBC River• Wikipedia River• Twitter River
    59. 59. Quelques Rivers...• CouchDB River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ River
    60. 60. Quelques Rivers...• CouchDB River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ River• ActiveMQ River
    61. 61. Quelques Rivers...• CouchDB River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ River• ActiveMQ River• RSS River
    62. 62. Quelques Rivers...• CouchDB River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ River• ActiveMQ River• RSS River• LDAP River
    63. 63. Quelques Rivers...• CouchDB River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ River• ActiveMQ River• RSS River• LDAP River• FS River
    64. 64. Quelques Rivers...• CouchDB River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ River• ActiveMQ River• RSS River• LDAP River• FS River• Dropbox River
    65. 65. Quelques Rivers...• CouchDB River• MongoDB River• JDBC River• Wikipedia River• Twitter River• RabbitMQ River• ActiveMQ River• RSS River• LDAP River• FS River• Dropbox River• Dick Rivers
    66. 66. Analyser La 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 !)
    67. 67. Des tweetsID Username Date Hashtag1 dadoonet 2012-04-18 12 ideo 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04-18 25 ideo 2012-04-18 66 elasticsearch 2012-04-19 37 dadoonet 2012-04-19 38 ideo 2012-04-19 79 elasticsearch 2012-04-20 4
    68. 68. Term FacetD Username Date Hashtag1 dadoonet 2012-04-18 12 ideo 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04-18 25 ideo 2012-04-18 66 elasticsearch 2012-04-19 37 dadoonet 2012-04-19 38 ideo 2012-04-19 79 elasticsearch 2012-04-20 4
    69. 69. Term FacetD Username Date Hashtag1 dadoonet 2012-04-18 12 ideo 2012-04-18 53 elasticsearch 2012-04-18Username 2 Count4 dadoonet 2012-04-18dadoonet 2 35 ideo 2012-04-18 ideo 6 36 elasticsearch 2012-04-19 elasticsearch 3 37 dadoonet 2012-04-19 38 ideo 2012-04-19 79 elasticsearch 2012-04-20 4
    70. 70. Term FacetD Username Date Hashtag1 dadoonet 2012-04-18 12 ideo 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04-18 25 ideo 2012-04-18 66 elasticsearch 2012-04-19 37 dadoonet 2012-04-19 38 ideo 2012-04-19 79 elasticsearch 2012-04-20 4
    71. 71. Term FacetD Username Date Hashtag1 dadoonet 2012-04-18 "facets" : { 1 "users" : { "terms" : {"field" : "username"} } }2 ideo 2012-04-18 53 elasticsearch 2012-04-18 24 dadoonet 2012-04-18 25 ideo 2012-04-18 66 elasticsearch 2012-04-19 37 dadoonet 2012-04-19 38 ideo 2012-04-19 79 elasticsearch 2012-04-20 4
    72. 72. Term FacetD Username Date Hashtag1 dadoonet 2012-04-18 "facets" : { 1 "users" : { "terms" : {"field" : "username"} } }2 ideo 2012-04-18 5 "facets" : {3 elasticsearch 2012-04-18 "users" : { 2 "_type" : "terms",4 dadoonet 2012-04-18"missing" : 0,2 "total": 9,5 ideo 2012-04-18"other": 0, 6 "terms" : [6 elasticsearch 2012-04-19 { "term" : "dadoonet", "count" },3 }, 3 { "term" : "ideo", "count" : 3 : { "term" : "elasticsearch", "count" : 3 }7 dadoonet 2012-04-19] 3 }8 ideo 2012-04-19 } 79 elasticsearch 2012-04-20 4
    73. 73. Date Histogram Facet Date Hashtag 2012-04-18 1 2012-04-18 5h 2012-04-18 2 2012-04-18 2 2012-04-18 6h 2012-04-19 3 2012-04-19 3 2012-04-19 7h 2012-04-20 4
    74. 74. Date Histogram Facet Date Hashtag 2012-04-18 1 Par mois 2012-04-18 5 Date Counth 2012-04-18 2 2012-04 9 2012-04-18 2 2012-04-18 6h 2012-04-19 3 2012-04-19 3 2012-04-19 7h 2012-04-20 4
    75. 75. Date Histogram Facet Date Hashtag 2012-04-18 1 Par mois 2012-04-18 5 Date Counth 2012-04-18 2 2012-04 9 2012-04-18 2 2012-04-18 6 Par jourh 2012-04-19 3 Date Count 2012-04-19 3 2012-04-18 5 2012-04-19 7 2012-04-19 3h 2012-04-20 4 2012-04-20 1
    76. 76. Date Histogram Facet Date Hashtag 2012-04-18 1 2012-04-18 5h 2012-04-18 2 2012-04-18 2 2012-04-18 6h 2012-04-19 3 2012-04-19 3 2012-04-19 7h 2012-04-20 4
    77. 77. Date Histogram Facet Date Hashtag "facets" : { 2012-04-18 1 "perday" : { "date_histogram" : { 2012-04-18 5 "field" : "date", "interval" : "day" }h 2012-04-18 2 } } 2012-04-18 2 2012-04-18 6h 2012-04-19 3 2012-04-19 3 2012-04-19 7h 2012-04-20 4
    78. 78. Date Histogram Facet Date Hashtag "facets" : { 2012-04-18 1 "perday" : { "date_histogram" : { 2012-04-18 5 "field" : "date", "interval" : "day" }h 2012-04-18 2 } } 2012-04-18 2 "facets" : { 2012-04-18 6 "perday" : { "_type" : "date_histogram",h 2012-04-19 3 "entries": [ { "time": 1334700000000, "count": 5 }, 2012-04-19 3 { "time": 1334786400000, "count": 3 }, { "time": 1334872800000, "count": 1 } 2012-04-19 7 } ] }h 2012-04-20 4
    79. 79. Range FacetHashtag 1 5 2 2 6 3 3 7 4
    80. 80. Range FacetHashtag 1 5 2 Hashtag Count Min Max Moy Total 2 x<3 3 1 2 1.667 5 6 3 <= x < 5 3 3 4 3.333 10 3 x >= 5 3 5 7 6 18 3 7 4
    81. 81. Range FacetHashtag 1 5 2 2 6 3 3 7 4
    82. 82. Range Facet "facets" : { "hashtags" : { "range" : { "field" : "hashtags", "ranges" : [ { "to" : 3 },Hashtag { "from" : 3, "to" : 5 }, { "from" : 5 } ] } } } 1 5 2 2 6 3 3 7 4
    83. 83. Range Facet "facets" : { "hashtags" : { "range" : { "field" : "hashtags", "ranges" : [ { "to" : 3 },Hashtag { "from" : 3, "to" : 5 }, { "from" : 5 } ] } } } 1 "facets" : { 5 "hashtags" : { "_type" : "range", 2 "ranges" : [ { "to": 3, 2 "count": 3, "min": 1, "max": 2, 6 "total": 5, "mean": 1.667 }, { "from":3, "to" : 5, 3 "count": 3, "min": 3, "max": 4, 3 "total": 10, "mean": 3.333 },{ 7 "from":5, "count": 3, 4 "min": 5, "max": 7, "total": 18, "mean": 6 } ] } }
    84. 84. Site marchand
    85. 85. Site marchand
    86. 86. Site marchand
    87. 87. Site marchand
    88. 88. Site marchand Ranges Term Term Ranges
    89. 89. 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ées Date histogram Term
    90. 90. FacettesCartographiques
    91. 91. Reprenons notre formulaire
    92. 92. Reprenons notre formulaire Recherche Full Text
    93. 93. Reprenons notre formulaire
    94. 94. Reprenons notre formulaire
    95. 95. DémonstrationAvons-nous fait du bruit ?
    96. 96. Architecture
    97. 97. Architecture
    98. 98. Architecture Twitter Streaming API
    99. 99. Architecture Twitter Streaming API
    100. 100. Architecture Twitter Twitter Streaming River API$ curl -XPUT localhost:9200/_river/twitter/_meta -d { "type" : "twitter", "twitter" : { "user" : "twitter_user", "password" : "twitter_password", "filter" : { "tracks" : ["elasticsearch"] } }}
    101. 101. ArchitectureChrome Twitter Twitter Streaming River API $ curl -XPUT localhost:9200/_river/twitter/_meta -d { "type" : "twitter", "twitter" : { "user" : "twitter_user", "password" : "twitter_password", "filter" : { "tracks" : ["elasticsearch"] } } }
    102. 102. ArchitectureUn peu plus de technique : partitions / réplications / scalabilité
    103. 103. Lexique
    104. 104. Lexique• Nœud (node) : Une instance dElasticsearch (~ machine ?)
    105. 105. Lexique• Nœud (node) : Une instance dElasticsearch (~ machine ?)• Cluster : Un ensemble de nœuds
    106. 106. Lexique• Nœud (node) : Une instance dElasticsearch (~ machine ?)• Cluster : Un ensemble de nœuds• Partition (shard) : permet de découper un index en plusieurs parties pour y distribuer les documents
    107. 107. Lexique• Nœud (node) : Une instance dElasticsearch (~ 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 lensemble du cluster
    108. 108. Lexique• Nœud (node) : Une instance dElasticsearch (~ 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 lensemble du cluster• Partition primaire (primary shard) : partition élue "principale" dans lensemble du cluster. Cest là que se fait lindexation par Lucene. Il ny en a quune seule par shard dans lensemble du cluster.
    109. 109. Lexique• Nœud (node) : Une instance dElasticsearch (~ 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 lensemble du cluster• Partition primaire (primary shard) : partition élue "principale" dans lensemble du cluster. Cest là que se fait lindexation par Lucene. Il ny en a quune seule par shard dans lensemble du cluster.• Partition secondaire (secondary shard) : partitions secondaires stockant les replicas des partitions primaires.
    110. 110. Créons un index Cluster Nœud 1 Client CURL
    111. 111. Créons un index$ curl -XPUT localhost:9200/twitter -d { Cluster "index" : { Nœud 1 "number_of_shards" : 2, "number_of_replicas" : 1 Shard 0 } Shard 1} réplication non respectée Client CURL
    112. 112. Créons un index$ curl -XPUT localhost:9200/twitter -d { Cluster "index" : { Nœud 1 Nœud 2 "number_of_shards" : 2, "number_of_replicas" : 1 Shard 0 Shard 0 }} Shard 1 Shard 1 réplication respectée Client CURL
    113. 113. Réallocation dynamique Cluster Nœud 1 Nœud 2 Shard 0 Shard 0 Shard 1 Shard 1
    114. 114. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Shard 0 Shard 0 Shard 1 Shard 1
    115. 115. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Shard 0 Shard 0 Shard 0 Shard 1 Shard 1
    116. 116. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Shard 0 Shard 0 Shard 1 Shard 1
    117. 117. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Shard 0 Shard 0 Shard 1 Shard 1
    118. 118. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Nœud 4 Shard 0 Shard 0 Shard 1 Shard 1
    119. 119. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Nœud 4 Shard 0 Shard 0 Shard 1 Shard 1 Shard 1
    120. 120. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Nœud 4 Shard 0 Shard 0 Shard 1 Shard 1 Le tuning, cest trouver le bon équilibre entre le nombre de nodes, shards et replicas !
    121. 121. Indexons un document Cluster Nœud 1 Nœud 2 Nœud 3 Nœud 4 Shard 0 Shard 0 Shard 1 Shard 1 Doc 1 Client $ curl -XPUT localhost:9200/twitter/tweet/1 -d CURL { "text": "Bienvenue à la conférence #elasticsearch pour #ideobar", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", ... }
    122. 122. Indexons un document Cluster Nœud 1 Nœud 2 Nœud 3 Nœud 4 Doc Shard 0 1 Shard 0 Shard 1 Shard 1 Client $ curl -XPUT localhost:9200/twitter/tweet/1 -d CURL { "text": "Bienvenue à la conférence #elasticsearch pour #ideobar", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", ... }
    123. 123. Indexons un document Cluster Nœud 1 Nœud 2 Nœud 3 Nœud 4 Doc Shard 0 1 Shard 0 Shard 1 Shard 1 Client $ curl -XPUT localhost:9200/twitter/tweet/1 -d CURL { "text": "Bienvenue à la conférence #elasticsearch pour #ideobar", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", ... }
    124. 124. Indexons un document Cluster Nœud 1 Nœud 2 Nœud 3 Nœud 4 Doc Doc Shard 0 1 Shard 0 1 Shard 1 Shard 1 Client $ curl -XPUT localhost:9200/twitter/tweet/1 -d CURL { "text": "Bienvenue à la conférence #elasticsearch pour #ideobar", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", ... }
    125. 125. Indexons un 2ème document ClusterNœud 1 Nœud 2 Nœud 3 Nœud 4 Doc Doc Shard 0 1 Shard 0 1 Shard 1 Shard 1 Doc 2 Client $ curl -XPUT localhost:9200/twitter/tweet/2 -d CURL { "text": "Je fais du bruit pour #elasticsearch à #ideobar", "created_at": "2012-04-06T21:12:52.000Z", "source": "Twitter for iPad", ... }
    126. 126. Indexons un 2ème document ClusterNœud 1 Nœud 2 Nœud 3 Nœud 4 Doc Doc Shard 0 1 Shard 0 1 Shard 1 Shard 1 Doc 2 Client $ curl -XPUT localhost:9200/twitter/tweet/2 -d CURL { "text": "Je fais du bruit pour #elasticsearch à #ideobar", "created_at": "2012-04-06T21:12:52.000Z", "source": "Twitter for iPad", ... }
    127. 127. Indexons un 2ème document ClusterNœud 1 Nœud 2 Nœud 3 Nœud 4 Doc Doc Shard 0 1 Shard 0 1 Shard 1 Doc Shard 1 2 Client $ curl -XPUT localhost:9200/twitter/tweet/2 -d CURL { "text": "Je fais du bruit pour #elasticsearch à #ideobar", "created_at": "2012-04-06T21:12:52.000Z", "source": "Twitter for iPad", ... }
    128. 128. Indexons un 2ème document ClusterNœud 1 Nœud 2 Nœud 3 Nœud 4 Doc Doc Shard 0 1 Shard 0 1 Shard 1 Doc Shard 1 2 Client $ curl -XPUT localhost:9200/twitter/tweet/2 -d CURL { "text": "Je fais du bruit pour #elasticsearch à #ideobar", "created_at": "2012-04-06T21:12:52.000Z", "source": "Twitter for iPad", ... }
    129. 129. Indexons un 2ème document ClusterNœud 1 Nœud 2 Nœud 3 Nœud 4 Doc Doc Shard 0 1 Shard 0 1 Doc Doc Shard 1 Shard 1 2 2 Client $ curl -XPUT localhost:9200/twitter/tweet/2 -d CURL { "text": "Je fais du bruit pour #elasticsearch à #ideobar", "created_at": "2012-04-06T21:12:52.000Z", "source": "Twitter for iPad", ... }
    130. 130. Cherchons ! ClusterNœud 1 Nœud 2 Nœud 3 Nœud 4 Doc DocShard 0 1 Shard 0 1 Doc Doc Shard 1 Shard 1 2 2 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL
    131. 131. Cherchons ! ClusterNœud 1 Nœud 2 Nœud 3 Nœud 4 Doc DocShard 0 1 Shard 0 1 Doc Doc Shard 1 Shard 1 2 2 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL
    132. 132. Cherchons ! ClusterNœud 1 Nœud 2 Nœud 3 Nœud 4 Doc Shard 0 Shard 0 1 Doc Shard 1 Shard 1Doc 2 Doc 1 2 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL
    133. 133. Cherchons ! ClusterNœud 1 Nœud 2 Nœud 3 Nœud 4 DocShard 0 Shard 0 1 Doc Shard 1 Shard 1 2 Doc Doc 2 1 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL
    134. 134. Cherchons ! { Cluster "took" : 24,Nœud 1 "timed_out" : false,Nœud 3 Nœud 2 Nœud 4 "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, DocShard 0 "hits" : { Shard 0 1 "total" : 2, "max_score" : 0.227, Doc Shard 1 "hits" : [ { Shard 1 2 "_index" : "twitter", "_type" : "tweet", "_id" : "1", "_score" : 0.227, "_source" : { ... } Doc }, { Doc 2 "_index" : "twitter", 1 Client "_type" : "tweet", $ curl localhost:9200/twitter/_search?q=elasticsearch CURL "_id" : "2", "_score" : 0.152, "_source" : { ... } } ] }
    135. 135. Cherchons encore ! Cluster Nœud 1 Nœud 2 Nœud 3 Nœud 4 Doc Doc Shard 0 1 Shard 0 1 Doc Doc Shard 1 Shard 1 2 2 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL
    136. 136. Cherchons encore ! Cluster Nœud 1 Nœud 2 Nœud 3 Nœud 4 Doc Doc Shard 0 1 Shard 0 1 Doc Doc Shard 1 Shard 1 2 2 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL
    137. 137. Cherchons encore ! Cluster Nœud 1 Nœud 2 Nœud 3 Nœud 4 Doc Shard 0 1 Shard 0 Doc 1 Shard 1 Doc Doc Shard 1 2 2 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL
    138. 138. Cherchons encore ! Cluster Nœud 1 Nœud 2 Nœud 3 Doc Shard 0 1 Shard 0 Doc 1 Shard 1 Doc 2 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL
    139. 139. Cherchons encore ! Cluster Nœud 1 Nœud 2 Nœud 3 Doc Shard 0 1 Shard 0 Doc 1 Shard 1 Doc 2 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL
    140. 140. Cherchons encore ! Cluster Nœud 1 Nœud 2 Nœud 3 Doc Shard 0 1 Shard 0 Shard 1 Doc Doc 1 2 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL
    141. 141. Cherchons encore ! Cluster Nœud 1 Nœud 2 Nœud 3 Doc Shard 0 1 Shard 0 Shard 1 Doc Doc 2 1 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL
    142. 142. Cherchons encore ! { Cluster "took" : 24, Nœud 1 "timed_out" : false,Nœud 3 Nœud 2 "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, Doc Shard 0 1 "hits" : { Shard 0 "total" : 2, "max_score" : 0.227, Shard 1 "hits" : [ { "_index" : "twitter", "_type" : "tweet", "_id" : "1", "_score" : 0.227, "_source" : { ... } Doc }, { 2 Doc "_index" : "twitter", 1 Client "_type" : "tweet", $ curl localhost:9200/twitter/_search?q=elasticsearch CURL "_id" : "2", "_score" : 0.152, "_source" : { ... } } ] }
    143. 143. La communauté~100 contributeurs directs au projet (+ de 2800 watchers et + de 470 forks)
    144. 144. La communauté~100 contributeurs directs au projet (+ de 2800 watchers et + de 470 forks)
    145. 145. Rejoignez le mouvement ! @ElasticsearchFR www.elasticsearch.fr Questions ? Posez aussi vos questions sur elasticsearch-fr@googlegroups.comSlides sur http://fr.slideshare.net/dadoonet Sources sur https://github.com/dadoonet/talks

    ×