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




    David Pilato, Elasticsearch.com, Paris

mercredi 13 février 13                            1
Qui ?

    $ curl http://localhost:9200/talk/speaker/dpilato
    {
     "nom" : "David Pilato",
     "jobs" : [
      { "boite" : "SRA Europe (SSII)", "mission" : "bon à tout faire", "date" : "1995" },
      { "boite" : "SFR", "mission" : "touche à tout", "date" : "1997" },
      { "boite" : "e-Brands / Vivendi", "mission" : "chef de projets", "date": "2000" },
      { "boite" : "DGDDI (douane)", "mission" : "mouton à 5 pattes", "date" : "2005" },
      { "boite" : "IDEO Technologies", "mission" : "directeur technique", "date" : "2012" },
      { "boite" : "Elasticsearch.com", "mission" : "technical advocate", "date" : "2013" } ],
     "passions" : [ "famille", "job", "deejay" ],
     "blog" : "http://dev.david.pilato.fr/",
     "twitter" : [ "@dadoonet", "@elasticsearchfr", "@scrutmydocs" ],
     "email" : "david@pilato.fr"
    }




mercredi 13 février 13                                                                          2
ScrutMyDocs.org




mercredi 13 février 13                     3
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é)


mercredi 13 février 13                                           4
Pour la démo


                          Faites du bruit sur Twitter
                               avec le hashtag


                         #elasticsearch

mercredi 13 février 13                                  5
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%';

mercredi 13 février 13                                              6
Au final, on obtient




mercredi 13 février 13                         7
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 !


mercredi 13 février 13                                             8
L’indexation, c’est quoi
                                en fait ?




mercredi 13 février 13                              9
Elasticsearch
                            Your Data, your Search !




mercredi 13 février 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 !


mercredi 13 février 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, …


mercredi 13 février 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



mercredi 13 février 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

mercredi 13 février 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"
          }



mercredi 13 février 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
                   } ]
                 }
             }


mercredi 13 février 13                                                                 16
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



mercredi 13 février 13                                            17
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" }
                                     }
                                 ]
                             }
                         }’

mercredi 13 février 13                                                                   18
Injecter les données
                            Et au milieu coule une rivière




mercredi 13 février 13                                       19
La collecte


                 Doc
                             Stockage
                             Données




mercredi 13 février 13                  20
La collecte


                 Doc
                              Stockage
                              Données
                             Doc




mercredi 13 février 13                   21
La collecte


                              Stockage
                              Données
                             Doc   Doc




mercredi 13 février 13                   22
La collecte

                  Doc

                             Stockage
                             Données

                               Doc



                               Doc




mercredi 13 février 13                  23
La collecte


                             Stockage
                             Données
                               Doc




                               Doc




mercredi 13 février 13                  24
La collecte


                             Stockage
                             Données




                               Doc
                               Doc




mercredi 13 février 13                  25
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




mercredi 13 février 13                               26
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 !)




mercredi 13 février 13                                                                       27
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



mercredi 13 février 13                                               28
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



    mercredi 13 février 13                                           29
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



    mercredi 13 février 13                                                                30
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



mercredi 13 février 13                                               31
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



mercredi 13 février 13                                                          32
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



mercredi 13 février 13                                                         33
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
                                    } ] } }



mercredi 13 février 13                                               34
Site marchand

                               Ranges




                               Term




                               Term




                              Ranges
mercredi 13 février 13                   35
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




mercredi 13 février 13                                                       36
Facettes
                         Cartographiques




mercredi 13 février 13                     37
Reprenons notre
                           formulaire

                                    Recherche Full Text




mercredi 13 février 13                                    38
Reprenons notre
                           formulaire




mercredi 13 février 13                     39
Démonstration
                         Avez-vous fait du bruit ?




mercredi 13 février 13                               40
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"] }
                            }
                         }'

mercredi 13 février 13                                                           41
Démonstration
                         http://onemilliontweetmap.com/




mercredi 13 février 13                                    42
Architecture
                         Un peu plus de technique : partitions / réplications / scalabilité




mercredi 13 février 13                                                                        43
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


mercredi 13 février 13                                                  44
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




mercredi 13 février 13                                                                                       45
Réallocation dynamique


                                             Cluster

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


                         Shard 1   Shard 1




mercredi 13 février 13                                          46
Réallocation dynamique


                                             Cluster

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


                         Shard 1   Shard 1




mercredi 13 février 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




mercredi 13 février 13                                                     48
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 !



mercredi 13 février 13                                                            49
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",
                                                             ...
                                                        }'




mercredi 13 février 13                                                                                                       50
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",
                                                                ...
                                                           }'




mercredi 13 février 13                                                                                                          51
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",
                                                                ...
                                                           }'




mercredi 13 février 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",
                                                              ...
                                                         }'




mercredi 13 février 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                                          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",
                                                              ...
                                                         }'




mercredi 13 février 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


                                                   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",
                                                              ...
                                                         }'




mercredi 13 février 13                                                                                                 55
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",
                                                              ...
                                                         }'




mercredi 13 février 13                                                                                                 56
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




mercredi 13 février 13                                                                                    57
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




mercredi 13 février 13                                                                                58
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" : { ... }
                                                       } ]
                                                    }




mercredi 13 février 13                                                                                             59
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




mercredi 13 février 13                                                                                      60
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




mercredi 13 février 13                                                                                      61
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




mercredi 13 février 13                                                                                      62
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" : { ... }
                                                       } ]
                                                    }




mercredi 13 février 13                                                                                             63
La percolation
                            Ou la recherche inversée




mercredi 13 février 13                                 64
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 !



mercredi 13 février 13                                           65
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



mercredi 13 février 13                                          66
Usage du percolator
               $ curl -XPOST localhost:9200/_percolator/twitter/dadoonet -d ’{
                   "query" : { "term" : { "user.screen_name" : "dadoonet" } }
               }’

               $ curl -XPOST localhost:9200/_percolator/twitter/elasticsearch -d ’{
                   "query" : { "match" : { "hashtag.text" : "elasticsearch" } }
               }’

               $ curl -XPOST localhost:9200/_percolator/twitter/mycomplexquery -d ’{
                   "query" : {
                       "bool" : {
                           "must" : {
                               "term" : { "user" : "kimchy" }
                           },
                           "must_not" : {
                               "range" : {
                                   "age" : { "from" : 10, "to" : 20 }
                               }
                           },
                           "should" : [
                               {
                                   "term" : { "tag" : "wow" }
                               },{
                                   "match" : { "tag" : "elasticsearch is cool" }
                               }
                           ]
                       }
                   }
               }’

mercredi 13 février 13                                                                 67
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"
                   ]
               }

mercredi 13 février 13                                                                         68
Tout doit être
                           indexé ?
                            Analyse et mapping




mercredi 13 février 13                           69
The lazy dog...

                           The quick brown fox
                         jumped over the lazy Dog

                           The quick brown fox
                         jumped over the lazy dog

mercredi 13 février 13                              70
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
                   } ] }
mercredi 13 février 13                                                                             71
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", ...
                   } ] }



mercredi 13 février 13                                                                        72
Un analyseur


                          Un ensemble
                         de tokenizers et
                            de filtres


mercredi 13 février 13                      73
Un tokenizer

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


mercredi 13 février 13                                        74
Un filtre
               • Supprime ou transforme un token :
                    • asciifolding filter :
                                             éléphant -> elephant
                    • stemmer filter (french) :
                                             elephants -> "eleph"
                                              cheval -> "cheval"
                                             chevaux -> "cheval"
                    • phonetic (plugin) :
                                               quick -> "Q200"
                                                quik -> "Q200"



mercredi 13 février 13                                              75
Analyzer

    "analysis":{
        "analyzer":{
         "francais":{
          "type":"custom",
          "tokenizer":"standard",
          "filter":["lowercase", "stop_francais", "fr_stemmer", "asciifolding", "elision"]
         }
        },
        "filter":{
         "stop_francais":{
          "type":"stop",
          "stopwords":["_french_", "twitter"]
         },
         "fr_stemmer" : {
          "type" : "stemmer",
          "name" : "french"
         },
         "elision" : {
          "type" : "elision",
          "articles" : ["l", "m", "t", "qu", "n", "s", "j", "d"]
         }
        }
       }



mercredi 13 février 13                                                                       76
Mapping
            "type1" : {
                "properties" : {
                    "text1" : { "type" : "string", "analyzer" : "simple" },
                    "text2" : { "type" : "string", "index_analyzer" : "simple",
                                                    "search_analyzer" : "standard"
                    },
                    "text3" : {
                        "type" : "multi_field",
                        "fields" : {
                            "text3" : {
                                 "type" : "string",
                                 "analyzer" : "standard"
                            },
                            "ngram" : {
                                 "type" : "string",
                                 "analyzer" : "ngram"
                            },
                            "soundex" : {
                                 "type" : "string",
                                 "analyzer" : "soundex"
                            }
                        }
                    }
                }
            }


mercredi 13 février 13                                                               77
Les types
                    • string               • multi_field
                    • integer / long       • ip
                    • float / double        • geo_point
                    • boolean              • geo_shape
                    • null                 • binary
                    • array                • attachment (plugin)
                    • objects


mercredi 13 février 13                                             78
Champs spéciaux

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


mercredi 13 février 13                           79
Autres fonctionnalités
                    • highlighting
                    • scoring
                    • sort
                    • explain
                    • multi get / multi search
                    • bulk

mercredi 13 février 13                            80
Démonstrations
                          www.scrutmydocs.org
                           CURL est ton ami !
                         JAVA est aussi ton ami !




mercredi 13 février 13                              81
La communauté




                    ~100 contributeurs directs au projet (+ de 3200 watchers et + de 620 forks)
mercredi 13 février 13                                                                            82
La communauté




                         ~170 inscrits sur la mailing list, 70 messages / mois, ~300 followers
mercredi 13 février 13                                                                           83
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
mercredi 13 février 13                                                                                                                     84

Contenu connexe

PDF
Finist JUG - Elasticsearch
PDF
Poitou charentes JUG - Elasticsearch
PDF
Nantes JUG - Elasticsearch
KEY
Elasticsearch - Montpellier JUG
KEY
Elasticsearch - Devoxx France 2012
PDF
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
PPTX
A la recherche d'ElasticSearch
PDF
Lausanne JUG - Elasticsearch
Finist JUG - Elasticsearch
Poitou charentes JUG - Elasticsearch
Nantes JUG - Elasticsearch
Elasticsearch - Montpellier JUG
Elasticsearch - Devoxx France 2012
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
A la recherche d'ElasticSearch
Lausanne JUG - Elasticsearch

Tendances (20)

PDF
Elasticsearch - Esme sudria
PDF
Introduction à ElasticSearch
PDF
Paris data geek - Elasticsearch
PDF
Présentation de ElasticSearch / Digital apéro du 12/11/2014
PPTX
ElasticSearch : Architecture et Développement
PDF
Moteurs de recherche : un oeil sous le capot avec Elastic Search
KEY
Hands on lab Elasticsearch
PDF
Oxalide Workshop #3 - Elasticearch, an overview
PPTX
Tunis big data_meetup__21_nov2015__aymenzaafouri
PPTX
Elasticsearch
KEY
Lyon JUG - Elasticsearch
PPT
Solr and Elasticsearch in Action (at Breizhcamp)
PDF
Besoin de rien Envie de Search - Presentation Lucene Solr ElasticSearch
KEY
Elasticsearch - OSDC France 2012
PDF
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
PDF
Tirer le meilleur de ses données avec ElasticSearch
PDF
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
PDF
Découverte de Elastic search
PPTX
Atelier : Développement rapide d&rsquo;une application basée surXWiki
PPTX
Solr + Hadoop - Fouillez facilement dans votre système Big Data
Elasticsearch - Esme sudria
Introduction à ElasticSearch
Paris data geek - Elasticsearch
Présentation de ElasticSearch / Digital apéro du 12/11/2014
ElasticSearch : Architecture et Développement
Moteurs de recherche : un oeil sous le capot avec Elastic Search
Hands on lab Elasticsearch
Oxalide Workshop #3 - Elasticearch, an overview
Tunis big data_meetup__21_nov2015__aymenzaafouri
Elasticsearch
Lyon JUG - Elasticsearch
Solr and Elasticsearch in Action (at Breizhcamp)
Besoin de rien Envie de Search - Presentation Lucene Solr ElasticSearch
Elasticsearch - OSDC France 2012
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
Tirer le meilleur de ses données avec ElasticSearch
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
Découverte de Elastic search
Atelier : Développement rapide d&rsquo;une application basée surXWiki
Solr + Hadoop - Fouillez facilement dans votre système Big Data
Publicité

En vedette (20)

PDF
Apache solr andré bois-crettez 08
PPT
Chapitre1 elk chez_psa
PPT
Chapitre2 prise en_main_kibana
PPT
Chapitre3 elk concepts_avances
PPTX
Sistemas de información por jhonny añarumba
PPTX
Médias sociaux (3)
PDF
Barometre eco-services-2012
PPT
PPT
Partenariat avec le bal
PDF
PDF
Livretacceuil cram
PPTX
La maria.....
PPTX
Tema 2: Caprichos infantiles
PPTX
UTE PROBLEMAS FRECUENTES DEL DESARROLLO APEGO Y ANSIEDAD
PPT
Auto, 03.2008
PPTX
La Gioconda - Taller de TIC y Educación 2014
ODP
Tema 11:
PDF
"Misteriosos son los caminos del Señor… Pero más misteriosos aún son los cami...
PPTX
New york
Apache solr andré bois-crettez 08
Chapitre1 elk chez_psa
Chapitre2 prise en_main_kibana
Chapitre3 elk concepts_avances
Sistemas de información por jhonny añarumba
Médias sociaux (3)
Barometre eco-services-2012
Partenariat avec le bal
Livretacceuil cram
La maria.....
Tema 2: Caprichos infantiles
UTE PROBLEMAS FRECUENTES DEL DESARROLLO APEGO Y ANSIEDAD
Auto, 03.2008
La Gioconda - Taller de TIC y Educación 2014
Tema 11:
"Misteriosos son los caminos del Señor… Pero más misteriosos aún son los cami...
New york
Publicité

Similaire à Normandy JUG - Elasticsearch (20)

KEY
Devoxx: Tribulation d'un développeur sur le Cloud
PPTX
GraphTour - Workday: Tracking activity with Neo4j (French version)
PPTX
Solr, c'est simple et Big Data ready - prez au Lyon jug Fév 2014
PPT
Conférence Drupagora 2011: Drupal et les moteurs de recherche: Apache SolR
PDF
Big Data, Hadoop & Spark
PPTX
Elastic serach
PDF
P8 03 presentation
PDF
Tout ce que le getting started MongoDB ne vous dira pas
PDF
Tout ce que le getting started mongo db ne vous dira pas
PDF
Spark Summit Europe Wrap Up and TASM State of the Community
PDF
Oxalide Academy : Workshop #3 Elastic Search
PDF
MySQL Innovation & Cloud Day - Document Store avec MySQL HeatWave Database Se...
PDF
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilité
PDF
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
PDF
Oxalide MorningTech #1 - BigData
PDF
Microservices-DDD-Telosys-Devoxx-FR-2022
PDF
Nouveau look pour une nouvelle vie, version spéciale Ippon
PDF
HTML5, Spring, NoSQL et mobilité
PPTX
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris
PPTX
[GAB2016] Azure DocumentDB - Jean-Luc Boucho
Devoxx: Tribulation d'un développeur sur le Cloud
GraphTour - Workday: Tracking activity with Neo4j (French version)
Solr, c'est simple et Big Data ready - prez au Lyon jug Fév 2014
Conférence Drupagora 2011: Drupal et les moteurs de recherche: Apache SolR
Big Data, Hadoop & Spark
Elastic serach
P8 03 presentation
Tout ce que le getting started MongoDB ne vous dira pas
Tout ce que le getting started mongo db ne vous dira pas
Spark Summit Europe Wrap Up and TASM State of the Community
Oxalide Academy : Workshop #3 Elastic Search
MySQL Innovation & Cloud Day - Document Store avec MySQL HeatWave Database Se...
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et mobilité
Nouveau look pour une nouvelle vie : HTML5, Spring, NoSQL et Mobile
Oxalide MorningTech #1 - BigData
Microservices-DDD-Telosys-Devoxx-FR-2022
Nouveau look pour une nouvelle vie, version spéciale Ippon
HTML5, Spring, NoSQL et mobilité
Jean-Luc Boucho - Azure DocumentDB - Global Azure Bootcamp 2016 Paris
[GAB2016] Azure DocumentDB - Jean-Luc Boucho

Plus de David Pilato (9)

PDF
2018-10-02 - Un moteur de recherche NoSQL pour chercher^H^H^H^H^H^H^H^H trouv...
PDF
Managing your black friday logs Voxxed Luxembourg
PDF
Un moteur de recherche NoSQL pour chercher^H^H^H^H^H^H^H^H trouver...
PDF
Managing your Black Friday Logs NDC Oslo
PDF
Managing your black friday logs - Code Europe
PDF
Managing your black Friday logs - CloudConf.IT
PDF
Elasticsearch in 15 minutes
PDF
Elastify you application: from SQL to NoSQL in less than one hour!
KEY
Elasticsearch - Devoxx France 2012 - English version
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
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 - Code Europe
Managing your black Friday logs - CloudConf.IT
Elasticsearch in 15 minutes
Elastify you application: from SQL to NoSQL in less than one hour!
Elasticsearch - Devoxx France 2012 - English version

Dernier (7)

PDF
FORMATION EN Programmation En Langage C.pdf
PPTX
Souveraineté numérique - Définition et enjeux pour les entreprises et les dév...
PDF
Tendances tech 2025 - SFEIR & WENVISION.pdf
PPTX
Presentation_Securite_Reseaux_Bac+2.pptx
PDF
FORMATION COMPLETE EN EXCEL DONE BY MR. NYONGA BRICE.pdf
PDF
Modems expliqués- votre passerelle vers Internet.pdf
PDF
presentation_with_intro_compressee IEEE EPS France
FORMATION EN Programmation En Langage C.pdf
Souveraineté numérique - Définition et enjeux pour les entreprises et les dév...
Tendances tech 2025 - SFEIR & WENVISION.pdf
Presentation_Securite_Reseaux_Bac+2.pptx
FORMATION COMPLETE EN EXCEL DONE BY MR. NYONGA BRICE.pdf
Modems expliqués- votre passerelle vers Internet.pdf
presentation_with_intro_compressee IEEE EPS France

Normandy JUG - Elasticsearch

  • 1. Elasticsearch. Le moteur de recherche élastique pour tous David Pilato, Elasticsearch.com, Paris mercredi 13 février 13 1
  • 2. Qui ? $ curl http://localhost:9200/talk/speaker/dpilato { "nom" : "David Pilato", "jobs" : [ { "boite" : "SRA Europe (SSII)", "mission" : "bon à tout faire", "date" : "1995" }, { "boite" : "SFR", "mission" : "touche à tout", "date" : "1997" }, { "boite" : "e-Brands / Vivendi", "mission" : "chef de projets", "date": "2000" }, { "boite" : "DGDDI (douane)", "mission" : "mouton à 5 pattes", "date" : "2005" }, { "boite" : "IDEO Technologies", "mission" : "directeur technique", "date" : "2012" }, { "boite" : "Elasticsearch.com", "mission" : "technical advocate", "date" : "2013" } ], "passions" : [ "famille", "job", "deejay" ], "blog" : "http://dev.david.pilato.fr/", "twitter" : [ "@dadoonet", "@elasticsearchfr", "@scrutmydocs" ], "email" : "david@pilato.fr" } mercredi 13 février 13 2
  • 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é) mercredi 13 février 13 4
  • 5. Pour la démo Faites du bruit sur Twitter avec le hashtag #elasticsearch mercredi 13 février 13 5
  • 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%'; mercredi 13 février 13 6
  • 7. Au final, on obtient mercredi 13 février 13 7
  • 8. 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 ! mercredi 13 février 13 8
  • 9. L’indexation, c’est quoi en fait ? mercredi 13 février 13 9
  • 10. Elasticsearch Your Data, your Search ! mercredi 13 février 13 10
  • 11. 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 ! mercredi 13 février 13 11
  • 12. 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, … mercredi 13 février 13 12
  • 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 mercredi 13 février 13 13
  • 14. 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 mercredi 13 février 13 14
  • 15. 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" } mercredi 13 février 13 15
  • 16. 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 } ] } } mercredi 13 février 13 16
  • 17. 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 mercredi 13 février 13 17
  • 18. 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" } } ] } }’ mercredi 13 février 13 18
  • 19. Injecter les données Et au milieu coule une rivière mercredi 13 février 13 19
  • 20. La collecte Doc Stockage Données mercredi 13 février 13 20
  • 21. La collecte Doc Stockage Données Doc mercredi 13 février 13 21
  • 22. La collecte Stockage Données Doc Doc mercredi 13 février 13 22
  • 23. La collecte Doc Stockage Données Doc Doc mercredi 13 février 13 23
  • 24. La collecte Stockage Données Doc Doc mercredi 13 février 13 24
  • 25. La collecte Stockage Données Doc Doc mercredi 13 février 13 25
  • 26. 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 mercredi 13 février 13 26
  • 27. 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 !) mercredi 13 février 13 27
  • 28. 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 mercredi 13 février 13 28
  • 29. 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 mercredi 13 février 13 29
  • 30. 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 mercredi 13 février 13 30
  • 31. 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 mercredi 13 février 13 31
  • 32. 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 mercredi 13 février 13 32
  • 33. 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 mercredi 13 février 13 33
  • 34. 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 } ] } } mercredi 13 février 13 34
  • 35. Site marchand Ranges Term Term Ranges mercredi 13 février 13 35
  • 36. 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 mercredi 13 février 13 36
  • 37. Facettes Cartographiques mercredi 13 février 13 37
  • 38. Reprenons notre formulaire Recherche Full Text mercredi 13 février 13 38
  • 39. Reprenons notre formulaire mercredi 13 février 13 39
  • 40. Démonstration Avez-vous fait du bruit ? mercredi 13 février 13 40
  • 41. 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"] } } }' mercredi 13 février 13 41
  • 42. Démonstration http://onemilliontweetmap.com/ mercredi 13 février 13 42
  • 43. Architecture Un peu plus de technique : partitions / réplications / scalabilité mercredi 13 février 13 43
  • 44. 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 mercredi 13 février 13 44
  • 45. 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 mercredi 13 février 13 45
  • 46. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Shard 0 Shard 0 Shard 1 Shard 1 mercredi 13 février 13 46
  • 47. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Shard 0 Shard 0 Shard 0 Shard 1 Shard 1 mercredi 13 février 13 47
  • 48. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Nœud 4 Shard 0 Shard 0 Shard 1 Shard 1 mercredi 13 février 13 48
  • 49. 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 ! mercredi 13 février 13 49
  • 50. 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", ... }' mercredi 13 février 13 50
  • 51. 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", ... }' mercredi 13 février 13 51
  • 52. 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", ... }' mercredi 13 février 13 52
  • 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 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", ... }' mercredi 13 février 13 53
  • 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 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", ... }' mercredi 13 février 13 54
  • 55. 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", ... }' mercredi 13 février 13 55
  • 56. 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", ... }' mercredi 13 février 13 56
  • 57. 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 mercredi 13 février 13 57
  • 58. 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 mercredi 13 février 13 58
  • 59. 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" : { ... } } ] } mercredi 13 février 13 59
  • 60. 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 mercredi 13 février 13 60
  • 61. 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 mercredi 13 février 13 61
  • 62. 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 mercredi 13 février 13 62
  • 63. 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" : { ... } } ] } mercredi 13 février 13 63
  • 64. La percolation Ou la recherche inversée mercredi 13 février 13 64
  • 65. 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 ! mercredi 13 février 13 65
  • 66. 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 mercredi 13 février 13 66
  • 67. Usage du percolator $ curl -XPOST localhost:9200/_percolator/twitter/dadoonet -d ’{ "query" : { "term" : { "user.screen_name" : "dadoonet" } } }’ $ curl -XPOST localhost:9200/_percolator/twitter/elasticsearch -d ’{ "query" : { "match" : { "hashtag.text" : "elasticsearch" } } }’ $ curl -XPOST localhost:9200/_percolator/twitter/mycomplexquery -d ’{ "query" : { "bool" : { "must" : { "term" : { "user" : "kimchy" } }, "must_not" : { "range" : { "age" : { "from" : 10, "to" : 20 } } }, "should" : [ { "term" : { "tag" : "wow" } },{ "match" : { "tag" : "elasticsearch is cool" } } ] } } }’ mercredi 13 février 13 67
  • 68. 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" ] } mercredi 13 février 13 68
  • 69. Tout doit être indexé ? Analyse et mapping mercredi 13 février 13 69
  • 70. The lazy dog... The quick brown fox jumped over the lazy Dog The quick brown fox jumped over the lazy dog mercredi 13 février 13 70
  • 71. 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 } ] } mercredi 13 février 13 71
  • 72. 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", ... } ] } mercredi 13 février 13 72
  • 73. Un analyseur Un ensemble de tokenizers et de filtres mercredi 13 février 13 73
  • 74. Un tokenizer • Découpe une chaine en « mots » et transforme : • whitespace tokenizer : "the dog!" -> "the", "dog!" • standard tokenizer : "the dog!" -> "the", "dog" mercredi 13 février 13 74
  • 75. Un filtre • Supprime ou transforme un token : • asciifolding filter : éléphant -> elephant • stemmer filter (french) : elephants -> "eleph" cheval -> "cheval" chevaux -> "cheval" • phonetic (plugin) : quick -> "Q200" quik -> "Q200" mercredi 13 février 13 75
  • 76. Analyzer "analysis":{ "analyzer":{ "francais":{ "type":"custom", "tokenizer":"standard", "filter":["lowercase", "stop_francais", "fr_stemmer", "asciifolding", "elision"] } }, "filter":{ "stop_francais":{ "type":"stop", "stopwords":["_french_", "twitter"] }, "fr_stemmer" : { "type" : "stemmer", "name" : "french" }, "elision" : { "type" : "elision", "articles" : ["l", "m", "t", "qu", "n", "s", "j", "d"] } } } mercredi 13 février 13 76
  • 77. Mapping "type1" : { "properties" : { "text1" : { "type" : "string", "analyzer" : "simple" }, "text2" : { "type" : "string", "index_analyzer" : "simple", "search_analyzer" : "standard" }, "text3" : { "type" : "multi_field", "fields" : { "text3" : { "type" : "string", "analyzer" : "standard" }, "ngram" : { "type" : "string", "analyzer" : "ngram" }, "soundex" : { "type" : "string", "analyzer" : "soundex" } } } } } mercredi 13 février 13 77
  • 78. Les types • string • multi_field • integer / long • ip • float / double • geo_point • boolean • geo_shape • null • binary • array • attachment (plugin) • objects mercredi 13 février 13 78
  • 79. Champs spéciaux • _all (et include_in_all) • _source • _ttl • parent / child • nested mercredi 13 février 13 79
  • 80. Autres fonctionnalités • highlighting • scoring • sort • explain • multi get / multi search • bulk mercredi 13 février 13 80
  • 81. Démonstrations www.scrutmydocs.org CURL est ton ami ! JAVA est aussi ton ami ! mercredi 13 février 13 81
  • 82. La communauté ~100 contributeurs directs au projet (+ de 3200 watchers et + de 620 forks) mercredi 13 février 13 82
  • 83. La communauté ~170 inscrits sur la mailing list, 70 messages / mois, ~300 followers mercredi 13 février 13 83
  • 84. 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 mercredi 13 février 13 84