SlideShare une entreprise Scribd logo
1  sur  82
Elasticsearch.
                        Le moteur de recherche
                          élastique pour tous




   David Pilato, Elasticsearch.com, Paris

vendredi 22 mars 13
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"
    }




vendredi 22 mars 13
ScrutMyDocs.org




vendredi 22 mars 13
Elasticsearch.com

                  • Créée en 2012 par les auteurs
                      d’Elasticsearch

                      • Formation (publique et intra)
                      • Consulting (support dév)
                      • Abonnement annuel support pour la
                        production avec 3 niveaux de SLA
                        (délai de réponse et disponibilité)


vendredi 22 mars 13
Pour la démo


                       Faites du bruit sur Twitter
                            avec le hashtag


                      #elasticsearch

vendredi 22 mars 13
SQL Classique
                       Cherche moi un document
                de décembre 2011 portant sur la france
                     et contenant produit 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 ‘%produit%' AND
                lower(doc.commentaire) LIKE ‘%david%';

vendredi 22 mars 13
Au final, on obtient




vendredi 22 mars 13
Moteur de recherche ?
             • un moteur d’indexation de documents




             • un moteur de recherche dans les index
vendredi 22 mars 13
Elasticsearch
                         Your Data, your Search !




vendredi 22 mars 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 !


vendredi 22 mars 13
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, …


vendredi 22 mars 13
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"
       {
         "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 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



vendredi 22 mars 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 -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

vendredi 22 mars 13
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.r
         nAt this time, enjoying NoSQL world : CouchDB, ElasticSearch.rnDeeJay 4 times a
         year, just for fun !" }
         }'




         {
          "ok":true,
          "_index":"twitter",
          "_type":"tweet",
          "_id":"1"
         }



vendredi 22 mars 13
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,                                      Document
                  "max_score" : 0.227,
                  "hits" : [ {                          Coordonnées  source
                    "_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",
                      […]
                    }                                Pertinence
                  } ]
                }
            }


vendredi 22 mars 13
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" }
                                  }
                              ]
                          }
                      }’

vendredi 22 mars 13
Injecter les données
                         Et au milieu coule une rivière




vendredi 22 mars 13
La collecte


               Doc
                          Stockage
                          Données




vendredi 22 mars 13
La collecte


               Doc
                           Stockage
                           Données
                          Doc




vendredi 22 mars 13
La collecte


                           Stockage
                           Données
                          Doc   Doc




vendredi 22 mars 13
La collecte

                 Doc

                           Stockage
                           Données

                             Doc



                             Doc




vendredi 22 mars 13
La collecte


                          Stockage
                          Données
                            Doc




                            Doc




vendredi 22 mars 13
La collecte


                          Stockage
                          Données




                            Doc
                            Doc




vendredi 22 mars 13
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 Rivers




vendredi 22 mars 13
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 !)




vendredi 22 mars 13
Des tweets

                      ID    Username          Date      Hashtag
                      1     dadoonet       2012-04-18     1
                      2        talk        2012-04-18     5
                      3    elasticsearch   2012-04-18     2
                      4     dadoonet       2012-04-18     2
                      5        talk        2012-04-18     6
                      6    elasticsearch   2012-04-19     3
                      7     dadoonet       2012-04-19     3
                      8        talk        2012-04-19     7
                      9    elasticsearch   2012-04-20     4



vendredi 22 mars 13
Term Facet

D               Username        Date             Hashtag
1                dadoonet    2012-04-18            1
2                     talk   2012-04-18            5
3            elasticsearch   2012-04-18Username 2          Count
4                dadoonet    2012-04-18dadoonet    2        3
5                     talk   2012-04-18   talk     6        3
6            elasticsearch   2012-04-19
                                     elasticsearch 3        3
7                dadoonet    2012-04-19            3
8                     talk   2012-04-19            7
9            elasticsearch   2012-04-20            4



    vendredi 22 mars 13
Term Facet

D               Username        Date             Hashtag
1                dadoonet    2012-04-18
                                     "facets" : {    1
                                       "users" : { "terms" : {"field" : "username"} }
                                    }
2                     talk   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                     talk   2012-04-18"other": 0,   6
                                       "terms" : [
6            elasticsearch   2012-04-19 { "term" : "dadoonet", "count" },3 },
                                                     3
                                         { "term" : "talk", "count" : 3
                                                                        :

                                         { "term" : "elasticsearch", "count" : 3 }
7                dadoonet    2012-04-19]             3
                                     }
8                     talk   2012-04-19
                                   }                 7
9            elasticsearch   2012-04-20              4



    vendredi 22 mars 13
Date Histogram Facet

                  Date    Hashtag
           2012-04-18       1                  Par mois
           2012-04-18       5          Date               Count
h          2012-04-18       2        2012-04               9
           2012-04-18       2
           2012-04-18       6                  Par jour
h          2012-04-19       3          Date               Count
           2012-04-19       3       2012-04-18             5
           2012-04-19       7       2012-04-19             3
h          2012-04-20       4       2012-04-20             1



vendredi 22 mars 13
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



vendredi 22 mars 13
Range Facet

              Hashtag
                      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



vendredi 22 mars 13
Range Facet
                             "facets" : { "hashtags" : {
                               "range" : { "field" : "hashtag",
                               "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
                                 } ] } }



vendredi 22 mars 13
Site marchand

                            Ranges




                            Term




                            Term




                           Ranges
vendredi 22 mars 13
Analyse temps-réel
                  • 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




vendredi 22 mars 13
Facettes
                      Cartographiques




vendredi 22 mars 13
Reprenons notre
                        formulaire

                                 Recherche Full Text




vendredi 22 mars 13
Reprenons notre
                        formulaire




vendredi 22 mars 13
Démonstration
                      Avez-vous fait du bruit ?




vendredi 22 mars 13
Architecture

            Chrome
                                                          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"] }
                         }
                      }'

vendredi 22 mars 13
Démonstration
                      http://onemilliontweetmap.com/
                        http://www.scrutmydocs.org




vendredi 22 mars 13
Architecture
                      Un peu plus de technique : partitions / réplications / scalabilité




vendredi 22 mars 13
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


vendredi 22 mars 13
Créons un index


            $ curl -XPUT localhost:9200/twitter -d '{                                   Cluster
                 "index" : {
                                                                             Nœud 1
                                                                             Nœud 1               Nœud 2
                      "number_of_shards" : 2,
                      "number_of_replicas" : 1                               Shard 00
                                                                              Shard               Shard 0
                 }
                                                                             Shard 11
                                                                              Shard
            }'                                                                                    Shard 1




                                                 réplication non respectée
                                                   réplication respectée
                                                                                         Client
                                                                                         CURL




vendredi 22 mars 13
Réallocation dynamique


                                          Cluster

                      Nœud 1    Nœud 2              Nœud 3
                      Shard 0   Shard 0


                      Shard 1   Shard 1




vendredi 22 mars 13
Réallocation dynamique


                                          Cluster

                      Nœud 1    Nœud 2              Nœud 3
                      Shard 0   Shard 0              Shard 0


                      Shard 1   Shard 1




vendredi 22 mars 13
Réallocation dynamique


                                          Cluster

                      Nœud 1    Nœud 2              Nœud 3     Nœud 4
                      Shard 0                        Shard 0


                      Shard 1   Shard 1




vendredi 22 mars 13
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




                      Le tuning, c'est trouver le bon équilibre entre le
                         nombre de nodes, shards et replicas !



vendredi 22 mars 13
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 #JUG",
                                                          "created_at": "2012-04-06T20:45:36.000Z",
                                                          "source": "Twitter for iPad",
                                                          ...
                                                     }'




vendredi 22 mars 13
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 #JUG",
                                                             "created_at": "2012-04-06T20:45:36.000Z",
                                                             "source": "Twitter for iPad",
                                                             ...
                                                        }'




vendredi 22 mars 13
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 #JUG",
                                                             "created_at": "2012-04-06T20:45:36.000Z",
                                                             "source": "Twitter for iPad",
                                                             ...
                                                        }'




vendredi 22 mars 13
Indexons un                                                           2ème

                         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




                                 Doc
                                  2
                                       Client         $ curl -XPUT localhost:9200/twitter/tweet/2 -d '
                                       CURL           {
                                                           "text": "Je fais du bruit pour #elasticsearch à #JUG",
                                                           "created_at": "2012-04-06T21:12:52.000Z",
                                                           "source": "Twitter for iPad",
                                                           ...
                                                      }'




vendredi 22 mars 13
Indexons un                                                           2ème

                         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
                         Doc
                          2




                                       Client         $ curl -XPUT localhost:9200/twitter/tweet/2 -d '
                                       CURL           {
                                                           "text": "Je fais du bruit pour #elasticsearch à #JUG",
                                                           "created_at": "2012-04-06T21:12:52.000Z",
                                                           "source": "Twitter for iPad",
                                                           ...
                                                      }'




vendredi 22 mars 13
Indexons un                                                           2ème

                         document
                                                              Cluster

                      Nœ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 à #JUG",
                                                           "created_at": "2012-04-06T21:12:52.000Z",
                                                           "source": "Twitter for iPad",
                                                           ...
                                                      }'




vendredi 22 mars 13
Indexons un                                                           2ème

                         document
                                                              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 -XPUT localhost:9200/twitter/tweet/2 -d '
                                       CURL           {
                                                           "text": "Je fais du bruit pour #elasticsearch à #JUG",
                                                           "created_at": "2012-04-06T21:12:52.000Z",
                                                           "source": "Twitter for iPad",
                                                           ...
                                                      }'




vendredi 22 mars 13
Cherchons !

                                                           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




vendredi 22 mars 13
Cherchons !

                                                     Cluster

                      Nœud 1               Nœud 2              Nœud 3          Nœud 4
                                                                         Doc
                       Shard 0                                 Shard 0    1


                                                                                         Doc
                                           Shard 1                             Shard 1
                      Doc                                                                 2
                            Doc
                       1     2




                                  Client
                                           $ curl localhost:9200/twitter/_search?q=elasticsearch
                                  CURL




vendredi 22 mars 13
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 },
                                                                                Doc
                      Shard 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" : { ... }
                                                    } ]
                                                 }




vendredi 22 mars 13
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




vendredi 22 mars 13
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




vendredi 22 mars 13
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




vendredi 22 mars 13
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" : { ... }
                                                    } ]
                                                 }




vendredi 22 mars 13
La percolation
                         Ou la recherche inversée




vendredi 22 mars 13
Usage courant d’un
                      moteur de recherche

                  • J’indexe un document
                  • Je cherche de temps en temps si un
                      document m’intéresse

                  • Avec de la chance, il sera bien placé au
                      niveau pertinence dans les résultats.
                      Sinon, il passe inaperçu !



vendredi 22 mars 13
La recherche inversée

                  • Enregistrer ses critères de recherche
                  • A chaque document indexé, on
                      récupère la liste des recherches qui
                      correspondent
                  • On a un « listener » sur le moteur
                      d’indexation : le percolator



vendredi 22 mars 13
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" }
                              }
                          ]
                      }
                  }
              }’

vendredi 22 mars 13
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, Senior
              Developper.rnAt this time, enjoying NoSQL world : CouchDB, ElasticSearch.r
              nDeeJay 4 times a year, just for fun !" }
              }'




              {
                  "ok": true,
                  "_index": "twitter",
                  "_type": "tweet",
                  "_id": "1",
                  "matches": [
                    "dadoonet",
                    "elasticsearch"
                  ]
              }

vendredi 22 mars 13
Tout doit être
                        indexé ?
                         Analyse et mapping




vendredi 22 mars 13
The lazy dog...

                        The quick brown fox
                      jumped over the lazy Dog

                        The quick brown fox
                      jumped over the lazy dog

vendredi 22 mars 13
Analyseur standard
              $ curl -XPOST 'localhost:9200/test/_analyze?analyzer=standard&pretty=1' -d
              'The 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
                  } ] }
vendredi 22 mars 13
Analyseur whitespace
              $ curl -XPOST 'localhost:9200/test/_analyze?analyzer=whitespace&pretty=1' -d
              'The 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", ...
                  } ] }



vendredi 22 mars 13
Un analyseur


                       Un ensemble
                      de tokenizers et
                         de filtres


vendredi 22 mars 13
Un tokenizer

             • Découpe une chaine en « mots » et
                      transforme :
             • whitespace tokenizer :
                             "the dog!" -> "the", "dog!"
             • standard tokenizer :
                              "the dog!" -> "the", "dog"


vendredi 22 mars 13
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"



vendredi 22 mars 13
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"]
         }
        }
       }



vendredi 22 mars 13
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"
                           }
                       }
                   }
               }
           }


vendredi 22 mars 13
Les types
                  • string               • multi_field
                  • integer / long       • ip
                  • float / double        • geo_point
                  • boolean              • geo_shape
                  • null                 • binary
                  • array                • attachment (plugin)
                  • objects


vendredi 22 mars 13
Champs spéciaux

                  • _all (et include_in_all)
                  • _source
                  • _ttl
                  • parent / child
                  • nested


vendredi 22 mars 13
Autres fonctionnalités
                  • highlighting
                  • scoring
                  • sort
                  • explain
                  • multi get / multi search
                  • bulk

vendredi 22 mars 13
Démonstrations
                        CURL est ton ami !
                      JAVA est aussi ton ami !




vendredi 22 mars 13
La communauté




                  ~100 contributeurs directs au projet (+ de 3200 watchers et + de 620 forks)
vendredi 22 mars 13
La communauté




                      ~170 inscrits sur la mailing list, 70 messages / mois, ~300 followers
vendredi 22 mars 13
Rejoignez le mouvement !
                      @ElasticsearchFR
                                                                                     www.elasticsearch.fr




                                                                           ss
                                                                         re
                                                                      og
                                                                    pr
                                                                 in




                      Questions ?
                      Posez aussi vos questions sur elasticsearch-fr@googlegroups.com
                                               Prochaines rencontres sur http://www.meetup.com/elasticsearchfr/

            Slides sur http://fr.slideshare.net/dadoonet                           Sources sur https://github.com/elasticsearchfr/talks
vendredi 22 mars 13

Contenu connexe

Tendances

Introduction à ElasticSearch
Introduction à ElasticSearchIntroduction à ElasticSearch
Introduction à ElasticSearch
Fadel Chafai
 
Jug algeria x wiki-atelier
Jug algeria x wiki-atelierJug algeria x wiki-atelier
Jug algeria x wiki-atelier
Algeria JUG
 

Tendances (20)

Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab Elasticsearch
 
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
 
Présentation de ElasticSearch / Digital apéro du 12/11/2014
Présentation de ElasticSearch / Digital apéro du 12/11/2014Présentation de ElasticSearch / Digital apéro du 12/11/2014
Présentation de ElasticSearch / Digital apéro du 12/11/2014
 
Elasticsearch - Devoxx France 2012
Elasticsearch - Devoxx France 2012Elasticsearch - Devoxx France 2012
Elasticsearch - Devoxx France 2012
 
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshopMigrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
 
Introduction à ElasticSearch
Introduction à ElasticSearchIntroduction à ElasticSearch
Introduction à ElasticSearch
 
MongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de donnéesMongoDB : la base NoSQL qui réinvente la gestion de données
MongoDB : la base NoSQL qui réinvente la gestion de données
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overview
 
Tunis big data_meetup__21_nov2015__aymenzaafouri
Tunis big data_meetup__21_nov2015__aymenzaafouriTunis big data_meetup__21_nov2015__aymenzaafouri
Tunis big data_meetup__21_nov2015__aymenzaafouri
 
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
 
Atelier : Développement rapide d&rsquo;une application basée surXWiki
Atelier : Développement rapide d&rsquo;une application basée surXWikiAtelier : Développement rapide d&rsquo;une application basée surXWiki
Atelier : Développement rapide d&rsquo;une application basée surXWiki
 
Jug algeria x wiki-atelier
Jug algeria x wiki-atelierJug algeria x wiki-atelier
Jug algeria x wiki-atelier
 
Besoin de rien Envie de Search - Presentation Lucene Solr ElasticSearch
Besoin de rien Envie de Search - Presentation Lucene Solr ElasticSearchBesoin de rien Envie de Search - Presentation Lucene Solr ElasticSearch
Besoin de rien Envie de Search - Presentation Lucene Solr ElasticSearch
 
Elasticsearch
ElasticsearchElasticsearch
Elasticsearch
 
Découverte de Elastic search
Découverte de Elastic searchDécouverte de Elastic search
Découverte de Elastic search
 
Tout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pasTout ce que le getting started mongo db ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pas
 
Solr and Elasticsearch in Action (at Breizhcamp)
Solr and Elasticsearch in Action (at Breizhcamp)Solr and Elasticsearch in Action (at Breizhcamp)
Solr and Elasticsearch in Action (at Breizhcamp)
 
Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...
Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...
Webinaire 3 de la série « Retour aux fondamentaux » : Conception de schémas :...
 
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
Webinaire 4 de la série Retour aux fondamentaux : Indexation avancée, index d...
 

Similaire à Lausanne JUG - Elasticsearch

2014 04-09-fr - app dev series - session 4 - indexing
2014 04-09-fr - app dev series - session 4 - indexing2014 04-09-fr - app dev series - session 4 - indexing
2014 04-09-fr - app dev series - session 4 - indexing
MongoDB
 
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp012014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01
MongoDB
 
Adbs2012presentation 120527125034-phpapp02
Adbs2012presentation 120527125034-phpapp02Adbs2012presentation 120527125034-phpapp02
Adbs2012presentation 120527125034-phpapp02
ABES
 
Oxalide MorningTech #1 - BigData
Oxalide MorningTech #1 - BigDataOxalide MorningTech #1 - BigData
Oxalide MorningTech #1 - BigData
Ludovic Piot
 

Similaire à Lausanne JUG - Elasticsearch (20)

Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022
 
2014 04-09-fr - app dev series - session 4 - indexing
2014 04-09-fr - app dev series - session 4 - indexing2014 04-09-fr - app dev series - session 4 - indexing
2014 04-09-fr - app dev series - session 4 - indexing
 
Construisez votre première application MongoDB
Construisez votre première application MongoDBConstruisez votre première application MongoDB
Construisez votre première application MongoDB
 
Oxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic Search
 
Tout ce que le getting started MongoDB ne vous dira pas
Tout ce que le getting started MongoDB ne vous dira pasTout ce que le getting started MongoDB ne vous dira pas
Tout ce que le getting started MongoDB ne vous dira pas
 
Devoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le CloudDevoxx: Tribulation d'un développeur sur le Cloud
Devoxx: Tribulation d'un développeur sur le Cloud
 
Tout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pasTout ce que le getting started mongodb ne vous dira pas
Tout ce que le getting started mongodb ne vous dira pas
 
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp012014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01
2014 03-26-appdevseries-session3-interactingwiththedatabase-fr-phpapp01
 
NodeJs in real life
NodeJs in real lifeNodeJs in real life
NodeJs in real life
 
[GAB2016] Azure DocumentDB - Jean-Luc Boucho
[GAB2016] Azure DocumentDB - Jean-Luc Boucho[GAB2016] Azure DocumentDB - Jean-Luc Boucho
[GAB2016] Azure DocumentDB - Jean-Luc Boucho
 
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris
 
Devoxx 2014 : Atelier MongoDB - Decouverte de MongoDB 2.6
Devoxx 2014 : Atelier MongoDB - Decouverte de MongoDB 2.6Devoxx 2014 : Atelier MongoDB - Decouverte de MongoDB 2.6
Devoxx 2014 : Atelier MongoDB - Decouverte de MongoDB 2.6
 
Toutes les raisons d'adopter MongoDB
Toutes les raisons d'adopter MongoDBToutes les raisons d'adopter MongoDB
Toutes les raisons d'adopter MongoDB
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilité
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilitéNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilité
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilité
 
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et MobileNouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
 
Adbs2012presentation 120527125034-phpapp02
Adbs2012presentation 120527125034-phpapp02Adbs2012presentation 120527125034-phpapp02
Adbs2012presentation 120527125034-phpapp02
 
Gardez vos projets R organisés avec le package "project"
Gardez vos projets R organisés avec le package "project"Gardez vos projets R organisés avec le package "project"
Gardez vos projets R organisés avec le package "project"
 
Oxalide MorningTech #1 - BigData
Oxalide MorningTech #1 - BigDataOxalide MorningTech #1 - BigData
Oxalide MorningTech #1 - BigData
 
SQLSaturday Toulouse 2017 - Azure Data Lake : SELECT people FROM data-lake WH...
SQLSaturday Toulouse 2017 - Azure Data Lake : SELECT people FROM data-lake WH...SQLSaturday Toulouse 2017 - Azure Data Lake : SELECT people FROM data-lake WH...
SQLSaturday Toulouse 2017 - Azure Data Lake : SELECT people FROM data-lake WH...
 
Introduction à node.js
Introduction à node.js Introduction à node.js
Introduction à node.js
 

Plus de David Pilato

Plus de David Pilato (9)

2018-10-02 - Un moteur de recherche NoSQL pour chercher^H^H^H^H^H^H^H^H trouv...
2018-10-02 - Un moteur de recherche NoSQL pour chercher^H^H^H^H^H^H^H^H trouv...2018-10-02 - Un moteur de recherche NoSQL pour chercher^H^H^H^H^H^H^H^H trouv...
2018-10-02 - Un moteur de recherche NoSQL pour chercher^H^H^H^H^H^H^H^H trouv...
 
Managing your black friday logs Voxxed Luxembourg
Managing your black friday logs Voxxed LuxembourgManaging your black friday logs Voxxed Luxembourg
Managing your black friday logs Voxxed Luxembourg
 
Un moteur de recherche NoSQL pour chercher^H^H^H^H^H^H^H^H trouver...
Un moteur de recherche NoSQL pour chercher^H^H^H^H^H^H^H^H trouver...Un moteur de recherche NoSQL pour chercher^H^H^H^H^H^H^H^H trouver...
Un moteur de recherche NoSQL pour chercher^H^H^H^H^H^H^H^H trouver...
 
Managing your Black Friday Logs NDC Oslo
Managing your  Black Friday Logs NDC OsloManaging your  Black Friday Logs NDC Oslo
Managing your Black Friday Logs NDC Oslo
 
Managing your black friday logs - Code Europe
Managing your black friday logs - Code EuropeManaging your black friday logs - Code Europe
Managing your black friday logs - Code Europe
 
Managing your black Friday logs - CloudConf.IT
Managing your black Friday logs - CloudConf.ITManaging your black Friday logs - CloudConf.IT
Managing your black Friday logs - CloudConf.IT
 
Elasticsearch in 15 minutes
Elasticsearch in 15 minutesElasticsearch in 15 minutes
Elasticsearch in 15 minutes
 
Elastify you application: from SQL to NoSQL in less than one hour!
Elastify you application: from SQL to NoSQL in less than one hour!Elastify you application: from SQL to NoSQL in less than one hour!
Elastify you application: from SQL to NoSQL in less than one hour!
 
Elasticsearch - Devoxx France 2012 - English version
Elasticsearch - Devoxx France 2012 - English versionElasticsearch - Devoxx France 2012 - English version
Elasticsearch - Devoxx France 2012 - English version
 

Lausanne JUG - Elasticsearch

  • 1. Elasticsearch. Le moteur de recherche élastique pour tous David Pilato, Elasticsearch.com, Paris vendredi 22 mars 13
  • 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" } vendredi 22 mars 13
  • 4. Elasticsearch.com • Créée en 2012 par les auteurs d’Elasticsearch • Formation (publique et intra) • Consulting (support dév) • Abonnement annuel support pour la production avec 3 niveaux de SLA (délai de réponse et disponibilité) vendredi 22 mars 13
  • 5. Pour la démo Faites du bruit sur Twitter avec le hashtag #elasticsearch vendredi 22 mars 13
  • 6. SQL Classique Cherche moi un document de décembre 2011 portant sur la france et contenant produit 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 ‘%produit%' AND lower(doc.commentaire) LIKE ‘%david%'; vendredi 22 mars 13
  • 7. Au final, on obtient vendredi 22 mars 13
  • 8. Moteur de recherche ? • un moteur d’indexation de documents • un moteur de recherche dans les index vendredi 22 mars 13
  • 9. Elasticsearch Your Data, your Search ! vendredi 22 mars 13
  • 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 ! vendredi 22 mars 13
  • 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, … vendredi 22 mars 13
  • 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" { "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 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 vendredi 22 mars 13
  • 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 -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 vendredi 22 mars 13
  • 14. 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.r nAt this time, enjoying NoSQL world : CouchDB, ElasticSearch.rnDeeJay 4 times a year, just for fun !" } }' { "ok":true, "_index":"twitter", "_type":"tweet", "_id":"1" } vendredi 22 mars 13
  • 15. 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, Document "max_score" : 0.227, "hits" : [ { Coordonnées source "_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", […] } Pertinence } ] } } vendredi 22 mars 13
  • 16. 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" } } ] } }’ vendredi 22 mars 13
  • 17. Injecter les données Et au milieu coule une rivière vendredi 22 mars 13
  • 18. La collecte Doc Stockage Données vendredi 22 mars 13
  • 19. La collecte Doc Stockage Données Doc vendredi 22 mars 13
  • 20. La collecte Stockage Données Doc Doc vendredi 22 mars 13
  • 21. La collecte Doc Stockage Données Doc Doc vendredi 22 mars 13
  • 22. La collecte Stockage Données Doc Doc vendredi 22 mars 13
  • 23. La collecte Stockage Données Doc Doc vendredi 22 mars 13
  • 24. 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 Rivers vendredi 22 mars 13
  • 25. 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 !) vendredi 22 mars 13
  • 26. Des tweets ID Username Date Hashtag 1 dadoonet 2012-04-18 1 2 talk 2012-04-18 5 3 elasticsearch 2012-04-18 2 4 dadoonet 2012-04-18 2 5 talk 2012-04-18 6 6 elasticsearch 2012-04-19 3 7 dadoonet 2012-04-19 3 8 talk 2012-04-19 7 9 elasticsearch 2012-04-20 4 vendredi 22 mars 13
  • 27. Term Facet D Username Date Hashtag 1 dadoonet 2012-04-18 1 2 talk 2012-04-18 5 3 elasticsearch 2012-04-18Username 2 Count 4 dadoonet 2012-04-18dadoonet 2 3 5 talk 2012-04-18 talk 6 3 6 elasticsearch 2012-04-19 elasticsearch 3 3 7 dadoonet 2012-04-19 3 8 talk 2012-04-19 7 9 elasticsearch 2012-04-20 4 vendredi 22 mars 13
  • 28. Term Facet D Username Date Hashtag 1 dadoonet 2012-04-18 "facets" : { 1 "users" : { "terms" : {"field" : "username"} } } 2 talk 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 talk 2012-04-18"other": 0, 6 "terms" : [ 6 elasticsearch 2012-04-19 { "term" : "dadoonet", "count" },3 }, 3 { "term" : "talk", "count" : 3 : { "term" : "elasticsearch", "count" : 3 } 7 dadoonet 2012-04-19] 3 } 8 talk 2012-04-19 } 7 9 elasticsearch 2012-04-20 4 vendredi 22 mars 13
  • 29. Date Histogram Facet Date Hashtag 2012-04-18 1 Par mois 2012-04-18 5 Date Count h 2012-04-18 2 2012-04 9 2012-04-18 2 2012-04-18 6 Par jour h 2012-04-19 3 Date Count 2012-04-19 3 2012-04-18 5 2012-04-19 7 2012-04-19 3 h 2012-04-20 4 2012-04-20 1 vendredi 22 mars 13
  • 30. 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 vendredi 22 mars 13
  • 31. Range Facet Hashtag 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 vendredi 22 mars 13
  • 32. Range Facet "facets" : { "hashtags" : { "range" : { "field" : "hashtag", "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 } ] } } vendredi 22 mars 13
  • 33. Site marchand Ranges Term Term Ranges vendredi 22 mars 13
  • 34. Analyse temps-réel • 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 vendredi 22 mars 13
  • 35. Facettes Cartographiques vendredi 22 mars 13
  • 36. Reprenons notre formulaire Recherche Full Text vendredi 22 mars 13
  • 37. Reprenons notre formulaire vendredi 22 mars 13
  • 38. Démonstration Avez-vous fait du bruit ? vendredi 22 mars 13
  • 39. Architecture Chrome 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"] } } }' vendredi 22 mars 13
  • 40. Démonstration http://onemilliontweetmap.com/ http://www.scrutmydocs.org vendredi 22 mars 13
  • 41. Architecture Un peu plus de technique : partitions / réplications / scalabilité vendredi 22 mars 13
  • 42. 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 vendredi 22 mars 13
  • 43. Créons un index $ curl -XPUT localhost:9200/twitter -d '{ Cluster "index" : { Nœud 1 Nœud 1 Nœud 2 "number_of_shards" : 2, "number_of_replicas" : 1 Shard 00 Shard Shard 0 } Shard 11 Shard }' Shard 1 réplication non respectée réplication respectée Client CURL vendredi 22 mars 13
  • 44. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Shard 0 Shard 0 Shard 1 Shard 1 vendredi 22 mars 13
  • 45. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Shard 0 Shard 0 Shard 0 Shard 1 Shard 1 vendredi 22 mars 13
  • 46. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Nœud 4 Shard 0 Shard 0 Shard 1 Shard 1 vendredi 22 mars 13
  • 47. 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 Le tuning, c'est trouver le bon équilibre entre le nombre de nodes, shards et replicas ! vendredi 22 mars 13
  • 48. 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 #JUG", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", ... }' vendredi 22 mars 13
  • 49. 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 #JUG", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", ... }' vendredi 22 mars 13
  • 50. 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 #JUG", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", ... }' vendredi 22 mars 13
  • 51. Indexons un 2ème 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 Doc 2 Client $ curl -XPUT localhost:9200/twitter/tweet/2 -d ' CURL { "text": "Je fais du bruit pour #elasticsearch à #JUG", "created_at": "2012-04-06T21:12:52.000Z", "source": "Twitter for iPad", ... }' vendredi 22 mars 13
  • 52. Indexons un 2ème 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 Doc 2 Client $ curl -XPUT localhost:9200/twitter/tweet/2 -d ' CURL { "text": "Je fais du bruit pour #elasticsearch à #JUG", "created_at": "2012-04-06T21:12:52.000Z", "source": "Twitter for iPad", ... }' vendredi 22 mars 13
  • 53. Indexons un 2ème document Cluster Nœ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 à #JUG", "created_at": "2012-04-06T21:12:52.000Z", "source": "Twitter for iPad", ... }' vendredi 22 mars 13
  • 54. Indexons un 2ème document 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 -XPUT localhost:9200/twitter/tweet/2 -d ' CURL { "text": "Je fais du bruit pour #elasticsearch à #JUG", "created_at": "2012-04-06T21:12:52.000Z", "source": "Twitter for iPad", ... }' vendredi 22 mars 13
  • 55. Cherchons ! 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 vendredi 22 mars 13
  • 56. Cherchons ! Cluster Nœud 1 Nœud 2 Nœud 3 Nœud 4 Doc Shard 0 Shard 0 1 Doc Shard 1 Shard 1 Doc 2 Doc 1 2 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL vendredi 22 mars 13
  • 57. 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 }, Doc Shard 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" : { ... } } ] } vendredi 22 mars 13
  • 58. 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 vendredi 22 mars 13
  • 59. 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 vendredi 22 mars 13
  • 60. 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 vendredi 22 mars 13
  • 61. 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" : { ... } } ] } vendredi 22 mars 13
  • 62. La percolation Ou la recherche inversée vendredi 22 mars 13
  • 63. Usage courant d’un moteur de recherche • J’indexe un document • Je cherche de temps en temps si un document m’intéresse • Avec de la chance, il sera bien placé au niveau pertinence dans les résultats. Sinon, il passe inaperçu ! vendredi 22 mars 13
  • 64. La recherche inversée • Enregistrer ses critères de recherche • A chaque document indexé, on récupère la liste des recherches qui correspondent • On a un « listener » sur le moteur d’indexation : le percolator vendredi 22 mars 13
  • 65. 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" } } ] } } }’ vendredi 22 mars 13
  • 66. 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, Senior Developper.rnAt this time, enjoying NoSQL world : CouchDB, ElasticSearch.r nDeeJay 4 times a year, just for fun !" } }' { "ok": true, "_index": "twitter", "_type": "tweet", "_id": "1", "matches": [ "dadoonet", "elasticsearch" ] } vendredi 22 mars 13
  • 67. Tout doit être indexé ? Analyse et mapping vendredi 22 mars 13
  • 68. The lazy dog... The quick brown fox jumped over the lazy Dog The quick brown fox jumped over the lazy dog vendredi 22 mars 13
  • 69. Analyseur standard $ curl -XPOST 'localhost:9200/test/_analyze?analyzer=standard&pretty=1' -d 'The 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 } ] } vendredi 22 mars 13
  • 70. Analyseur whitespace $ curl -XPOST 'localhost:9200/test/_analyze?analyzer=whitespace&pretty=1' -d 'The 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", ... } ] } vendredi 22 mars 13
  • 71. Un analyseur Un ensemble de tokenizers et de filtres vendredi 22 mars 13
  • 72. Un tokenizer • Découpe une chaine en « mots » et transforme : • whitespace tokenizer : "the dog!" -> "the", "dog!" • standard tokenizer : "the dog!" -> "the", "dog" vendredi 22 mars 13
  • 73. 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" vendredi 22 mars 13
  • 74. 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"] } } } vendredi 22 mars 13
  • 75. 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" } } } } } vendredi 22 mars 13
  • 76. Les types • string • multi_field • integer / long • ip • float / double • geo_point • boolean • geo_shape • null • binary • array • attachment (plugin) • objects vendredi 22 mars 13
  • 77. Champs spéciaux • _all (et include_in_all) • _source • _ttl • parent / child • nested vendredi 22 mars 13
  • 78. Autres fonctionnalités • highlighting • scoring • sort • explain • multi get / multi search • bulk vendredi 22 mars 13
  • 79. Démonstrations CURL est ton ami ! JAVA est aussi ton ami ! vendredi 22 mars 13
  • 80. La communauté ~100 contributeurs directs au projet (+ de 3200 watchers et + de 620 forks) vendredi 22 mars 13
  • 81. La communauté ~170 inscrits sur la mailing list, 70 messages / mois, ~300 followers vendredi 22 mars 13
  • 82. Rejoignez le mouvement ! @ElasticsearchFR www.elasticsearch.fr ss re og pr in Questions ? Posez aussi vos questions sur elasticsearch-fr@googlegroups.com Prochaines rencontres sur http://www.meetup.com/elasticsearchfr/ Slides sur http://fr.slideshare.net/dadoonet Sources sur https://github.com/elasticsearchfr/talks vendredi 22 mars 13