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



David Pilato, IDEO Technologies, Paris
Tanguy Leroux, ZENIKA, Lyon
Qui ?

$ curl http://localhost:9200/talk/speaker/tlrx
{
 "nom" : "Tanguy Leroux",
 "jobs" : [
  { "boite" : "SQLi", "mission" : "Chef de projet technique", "duree" : 7 },
  { "boite" : "Zenika", "mission" : "Architecte JEE", "duree" : 1 } ],
 "passions" : [ "java", "oenologie", "vtt" ],
 "blog" : "http://blog.zenika.com/",
 "twitter" : [ "@tlrx" ],
 "email" : "tanguy.leroux@gmail.com"
}
Qui ?

$ curl http://localhost:9200/talk/speaker/tlrx
{
 "nom" : "Tanguy Leroux",
 "jobs" : [
  { "boite" : "SQLi", "mission" : "Chef de projet technique", "duree" : 7 },
  { "boite" : "Zenika", "mission" : "Architecte JEE", "duree" : 1 } ],
 "passions" : [ "java", "oenologie", "vtt" ],
 "blog" : "http://blog.zenika.com/",
 "twitter" : [ "@tlrx" ],
 "email" : "tanguy.leroux@gmail.com"
}
Qui ?

$ curl http://localhost:9200/talk/speaker/dpilato
{
 "nom" : "David Pilato",
 "jobs" : [
  { "boite" : "SRA Europe (SSII)", "mission" : "bon à tout faire", "duree" : 3 },
  { "boite" : "SFR", "mission" : "touche à tout", "duree" : 3 },
  { "boite" : "e-Brands / Vivendi", "mission" : "chef de projets", "duree" : 4 },
  { "boite" : "DGDDI (douane)", "mission" : "mouton à 5 pattes", "duree" : 8 },
  { "boite" : "IDEO Technologies", "mission" : "directeur technique", "duree" : 0 } ],
 "passions" : [ "famille", "job", "deejay" ],
 "blog" : "http://dev.david.pilato.fr/",
 "twitter" : [ "@dadoonet", "@elasticsearchfr", "@scrutmydocs" ],
 "email" : "david@pilato.fr"
}
Qui ?

$ curl http://localhost:9200/talk/speaker/dpilato
{
 "nom" : "David Pilato",
 "jobs" : [
  { "boite" : "SRA Europe (SSII)", "mission" : "bon à tout faire", "duree" : 3 },
  { "boite" : "SFR", "mission" : "touche à tout", "duree" : 3 },
  { "boite" : "e-Brands / Vivendi", "mission" : "chef de projets", "duree" : 4 },
  { "boite" : "DGDDI (douane)", "mission" : "mouton à 5 pattes", "duree" : 8 },
  { "boite" : "IDEO Technologies", "mission" : "directeur technique", "duree" : 0 } ],
 "passions" : [ "famille", "job", "deejay" ],
 "blog" : "http://dev.david.pilato.fr/",
 "twitter" : [ "@dadoonet", "@elasticsearchfr", "@scrutmydocs" ],
 "email" : "david@pilato.fr"
}
ScrutMyDocs.org
Pour la démo


 Faites du bruit sur Twitter
      avec le hashtag


#elasticsearch
SQL Classique
        Cherche moi un document
 de décembre 2011 portant sur la france
      et contenant tanguy et david
En SQL :
SQL Classique
        Cherche moi un document
 de décembre 2011 portant sur la france
      et contenant tanguy 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 ‘%tanguy%' AND
  lower(doc.commentaire) LIKE ‘%david%';
Les limites de la
       recherche SQL
• En général, on se limite aux champs
  figés ou codifiés
• Pas de tolérance aux fotes de frappe
• Performances désastreuses sur du like
  % sur des millions de ligne

• Plombe les performances de l’insertion
• Recherche « google » impossible !
Au final, on obtient

             • Autrement dit :
               tu as intérêt à
               savoir ce que
               tu cherches !
             • Fouiller est
               interdit !
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 !
Elasticsearch
Elasticsearch
   Your Data, your Search !
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 !
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, …
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"




• Type : Regroupe des documents de même type
• Index : Espace logique de stockage des documents dont les
   types sont fonctionnellement communs
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 #lyonjug",
  "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": "lyonjug", "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
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 #lyonjug",
  "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": "lyonjug", "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
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 #lyonjug",
  "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": "lyonjug", "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
Interagir avec
Elasticsearch
Interagir avec
              Elasticsearch
•   API REST : http://host:port/[index]/[type]/[_action/id]
    Méthodes HTTP : GET, POST, PUT, DELETE
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
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
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
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
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
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
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
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
Indexer
$ curl -XPUT localhost:9200/twitter/tweet/1 -d '
{
   "text": "Bienvenue à la conférence #elasticsearch pour #lyonjug",
   "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": "lyonjug", "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 !" }
}'
Indexer
$ curl -XPUT localhost:9200/twitter/tweet/1 -d '
{
   "text": "Bienvenue à la conférence #elasticsearch pour #lyonjug",
   "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": "lyonjug", "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"
}
Chercher
$ curl localhost:9200/twitter/tweet/_search?q=elasticsearch
Chercher
    $ curl localhost:9200/twitter/tweet/_search?q=elasticsearch




{
    "took" : 24,
    "timed_out" : false,
    "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 },
    "hits" : {
      "total" : 1,
      "max_score" : 0.227,
      "hits" : [ {
        "_index" : "twitter",
        "_type" : "tweet",
        "_id" : "1",
        "_score" : 0.227, "_source" : {
          "text": "Bienvenue à la conférence #elasticsearch pour #lyonjug",
          "created_at": "2012-04-06T20:45:36.000Z",
          "source": "Twitter for iPad",
          […]
        }
      } ]
    }
}
Chercher
    $ curl localhost:9200/twitter/tweet/_search?q=elasticsearch




{
    "took" : 24,                      Nb de
    "timed_out" : false,
                                    documents
    "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 },
    "hits" : {
      "total" : 1,
      "max_score" : 0.227,
      "hits" : [ {
        "_index" : "twitter",
        "_type" : "tweet",
        "_id" : "1",
        "_score" : 0.227, "_source" : {
          "text": "Bienvenue à la conférence #elasticsearch pour #lyonjug",
          "created_at": "2012-04-06T20:45:36.000Z",
          "source": "Twitter for iPad",
          […]
        }
      } ]
    }
}
Chercher
    $ curl localhost:9200/twitter/tweet/_search?q=elasticsearch




{
    "took" : 24,
    "timed_out" : false,
    "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 },
    "hits" : {
      "total" : 1,
      "max_score" : 0.227,
      "hits" : [ {                          Coordonnées
        "_index" : "twitter",
        "_type" : "tweet",
        "_id" : "1",
        "_score" : 0.227, "_source" : {
          "text": "Bienvenue à la conférence #elasticsearch pour #lyonjug",
          "created_at": "2012-04-06T20:45:36.000Z",
          "source": "Twitter for iPad",
          […]
        }
      } ]
    }
}
Chercher
    $ curl localhost:9200/twitter/tweet/_search?q=elasticsearch




{
    "took" : 24,
    "timed_out" : false,
    "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 },
    "hits" : {
      "total" : 1,
      "max_score" : 0.227,
      "hits" : [ {
        "_index" : "twitter",
        "_type" : "tweet",
        "_id" : "1",
        "_score" : 0.227, "_source" : {
          "text": "Bienvenue à la conférence #elasticsearch pour #lyonjug",
          "created_at": "2012-04-06T20:45:36.000Z",
          "source": "Twitter for iPad",
          […]
        }                                Pertinence
      } ]
    }
}
Chercher
    $ curl localhost:9200/twitter/tweet/_search?q=elasticsearch




{
    "took" : 24,
    "timed_out" : false,
    "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 },
    "hits" : {
      "total" : 1,                                           Document
      "max_score" : 0.227,
      "hits" : [ {
                                                              source
        "_index" : "twitter",
        "_type" : "tweet",
        "_id" : "1",
        "_score" : 0.227, "_source" : {
          "text": "Bienvenue à la conférence #elasticsearch pour #lyonjug",
          "created_at": "2012-04-06T20:45:36.000Z",
          "source": "Twitter for iPad",
          […]
        }
      } ]
    }
}
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
Query DSL
• Requêtes précises : plutôt que de
  chercher « à la google », on peut
  utiliser des critères précis :
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" }
              }
          ]
      }
  }’
Injecter les données
   Et au milieu coule une rivière
La collecte
La collecte


    Stockage
    Données
La collecte


Doc
          Stockage
          Données
La collecte


     Stockage
     Données
    Doc
La collecte


Doc
           Stockage
           Données
          Doc
La collecte


     Stockage
     Données
    Doc   Doc
La collecte


     Stockage
     Données
    Doc   Doc
La collecte


     Stockage
     Données
    Doc   Doc
La collecte


    Stockage
    Données

      Doc



      Doc
La collecte

Doc

          Stockage
          Données

            Doc



            Doc
La collecte


    Stockage
    Données
      Doc




      Doc
La collecte


    Stockage
    Données




      Doc
      Doc
Quelques Rivers...
Quelques Rivers...
• CouchDB River
Quelques Rivers...
• CouchDB River
• MongoDB River
Quelques Rivers...
• CouchDB River
• MongoDB River
• JDBC River
Quelques Rivers...
• CouchDB River
• MongoDB River
• JDBC River
• Wikipedia River
Quelques Rivers...
• CouchDB River
• MongoDB River
• JDBC River
• Wikipedia River
• Twitter River
Quelques Rivers...
• CouchDB River
• MongoDB River
• JDBC River
• Wikipedia River
• Twitter River
• RabbitMQ River
Quelques Rivers...
• CouchDB River
• MongoDB River
• JDBC River
• Wikipedia River
• Twitter River
• RabbitMQ River
• ActiveMQ River
Quelques Rivers...
• CouchDB River
• MongoDB River
• JDBC River
• Wikipedia River
• Twitter River
• RabbitMQ River
• ActiveMQ River
• RSS River
Quelques Rivers...
• CouchDB River
• MongoDB River
• JDBC River
• Wikipedia River
• Twitter River
• RabbitMQ River
• ActiveMQ River
• RSS River
• LDAP River
Quelques Rivers...
• CouchDB River
• MongoDB River
• JDBC River
• Wikipedia River
• Twitter River
• RabbitMQ River
• ActiveMQ River
• RSS River
• LDAP River
• FS River
Quelques Rivers...
• CouchDB River
• MongoDB River
• JDBC River
• Wikipedia River
• Twitter River
• RabbitMQ River
• ActiveMQ River
• RSS River
• LDAP River
• FS River
• Dropbox River
Quelques Rivers...
• CouchDB River
• MongoDB River
• JDBC River
• Wikipedia River
• Twitter River
• RabbitMQ River
• ActiveMQ River
• RSS River
• LDAP River
• FS River
• Dropbox River
• Dick Rivers
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 !)
Des tweets

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

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

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

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

D    Username          Date            Hashtag
1    dadoonet       2012-04-18
                            "facets" : {    1
                              "users" : { "terms" : {"field" : "username"} }
                           }
2       tlrx        2012-04-18             5
3   elasticsearch   2012-04-18             2
4    dadoonet       2012-04-18             2
5       tlrx        2012-04-18             6
6   elasticsearch   2012-04-19             3
7    dadoonet       2012-04-19             3
8       tlrx        2012-04-19             7
9   elasticsearch   2012-04-20             4
Term Facet

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

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

       Date      Hashtag
    2012-04-18     1
    2012-04-18     5
h   2012-04-18     2
    2012-04-18     2
    2012-04-18     6
h   2012-04-19     3
    2012-04-19     3
    2012-04-19     7
h   2012-04-20     4
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
h   2012-04-19     3
    2012-04-19     3
    2012-04-19     7
h   2012-04-20     4
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
Date Histogram Facet

       Date      Hashtag
    2012-04-18     1
    2012-04-18     5
h   2012-04-18     2
    2012-04-18     2
    2012-04-18     6
h   2012-04-19     3
    2012-04-19     3
    2012-04-19     7
h   2012-04-20     4
Date Histogram Facet

       Date      Hashtag
                       "facets" : {
    2012-04-18     1     "perday" : {
                           "date_histogram" : {
    2012-04-18     5         "field" : "date",
                             "interval" : "day"
                           }
h   2012-04-18     2     }
                       }
    2012-04-18     2
    2012-04-18     6
h   2012-04-19     3
    2012-04-19     3
    2012-04-19     7
h   2012-04-20     4
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
Range Facet

Hashtag
  1
  5
  2
  2
  6
  3
  3
  7
  4
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
Range Facet

Hashtag
  1
  5
  2
  2
  6
  3
  3
  7
  4
Range Facet
            "facets" : { "hashtags" : {
              "range" : { "field" : "hashtag",
              "ranges" : [
                 { "to" : 3 },
Hashtag          { "from" : 3, "to" : 5 },
                 { "from" : 5 }
              ] } } }
  1
  5
  2
  2
  6
  3
  3
  7
  4
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
                 } ] } }
Site marchand
Site marchand
Site marchand
Site marchand
Site marchand

      Ranges




      Term




      Term




     Ranges
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
Facettes
Cartographiques
Reprenons notre
  formulaire
Reprenons notre
  formulaire

           Recherche Full Text
Reprenons notre
  formulaire
Reprenons notre
  formulaire
Démonstration
Avons-nous fait du bruit ?
Architecture
Architecture
Architecture

          Twitter
         Streaming
            API
Architecture

          Twitter
         Streaming
            API
Architecture

                                    Twitter
                    Twitter        Streaming
                     River            API




$ curl -XPUT localhost:9200/_river/twitter/_meta -d '
{
   "type" : "twitter",
   "twitter" : {
     "user" : "twitter_user",
     "password" : "twitter_password",
     "filter" : { "tracks" : ["elasticsearch"] }
   }
}'
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"] }
       }
    }'
Architecture
Un peu plus de technique : partitions / réplications / scalabilité
Lexique
Lexique
• Nœud (node) : Une instance d'Elasticsearch (~ machine ?)
Lexique
• Nœud (node) : Une instance d'Elasticsearch (~ machine ?)
• Cluster : Un ensemble de nœuds
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
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
Lexique
• Nœud (node) : Une instance d'Elasticsearch (~ machine ?)
• Cluster : Un ensemble de nœuds
• Partition (shard) : permet de découper un index en plusieurs
   parties pour y distribuer les documents

• Réplication (replica) : recopie d’une partition en une ou
   plusieurs copies dans l'ensemble du cluster

• Partition primaire (primary shard) : partition élue
   "principale" dans l'ensemble du cluster. C'est là que se fait
   l'indexation par Lucene. Il n'y en a qu'une seule par shard dans
   l'ensemble du cluster.
Lexique
• Nœud (node) : Une instance d'Elasticsearch (~ machine ?)
• Cluster : Un ensemble de nœuds
• Partition (shard) : permet de découper un index en plusieurs
   parties pour y distribuer les documents

• Réplication (replica) : recopie d’une partition en une ou
   plusieurs copies dans l'ensemble du cluster

• Partition primaire (primary shard) : partition élue
   "principale" dans l'ensemble du cluster. C'est là que se fait
   l'indexation par Lucene. Il n'y en a qu'une seule par shard dans
   l'ensemble du cluster.

• Partition secondaire (secondary shard) : partitions
   secondaires stockant les replicas des partitions primaires.
Créons un index


                    Cluster

           Nœud 1




                     Client
                     CURL
Créons un index


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

     }
                                                                 Shard 1
}'




                                     réplication non respectée
                                                                            Client
                                                                            CURL
Créons un index


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




                                       réplication respectée
                                                                          Client
                                                                          CURL
Réallocation dynamique


                       Cluster

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


   Shard 1   Shard 1
Réallocation dynamique


                       Cluster

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


   Shard 1   Shard 1
Réallocation dynamique


                       Cluster

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


   Shard 1   Shard 1
Réallocation dynamique


                       Cluster

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


   Shard 1   Shard 1
Réallocation dynamique


                       Cluster

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


   Shard 1   Shard 1
Réallocation dynamique


                       Cluster

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


   Shard 1   Shard 1
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
Réallocation dynamique


                           Cluster

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


                 Shard 1                        Shard 1




 Le tuning, c'est trouver le bon équilibre entre le
    nombre de nodes, shards et replicas !
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 #lyonjug",
                                    "created_at": "2012-04-06T20:45:36.000Z",
                                    "source": "Twitter for iPad",
                                    ...
                               }'
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 #lyonjug",
                                       "created_at": "2012-04-06T20:45:36.000Z",
                                       "source": "Twitter for iPad",
                                       ...
                                  }'
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 #lyonjug",
                                       "created_at": "2012-04-06T20:45:36.000Z",
                                       "source": "Twitter for iPad",
                                       ...
                                  }'
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 #lyonjug",
                                       "created_at": "2012-04-06T20:45:36.000Z",
                                       "source": "Twitter for iPad",
                                       ...
                                  }'
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 à #lyonjug",
                                     "created_at": "2012-04-06T21:12:52.000Z",
                                     "source": "Twitter for iPad",
                                     ...
                                }'
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 à #lyonjug",
                                     "created_at": "2012-04-06T21:12:52.000Z",
                                     "source": "Twitter for iPad",
                                     ...
                                }'
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 à #lyonjug",
                                     "created_at": "2012-04-06T21:12:52.000Z",
                                     "source": "Twitter for iPad",
                                     ...
                                }'
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 à #lyonjug",
                                     "created_at": "2012-04-06T21:12:52.000Z",
                                     "source": "Twitter for iPad",
                                     ...
                                }'
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 à #lyonjug",
                                     "created_at": "2012-04-06T21:12:52.000Z",
                                     "source": "Twitter for iPad",
                                     ...
                                }'
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
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
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
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
                                                                        2




                  Doc
          Doc      2
           1
                Client
                         $ curl localhost:9200/twitter/_search?q=elasticsearch
                CURL
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" : { ... }
                              } ]
                           }
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
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
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
Cherchons encore !

                                       Cluster

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




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

                                       Cluster

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




                  Client
                           $ curl localhost:9200/twitter/_search?q=elasticsearch
                  CURL
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
Cherchons encore !

                                   Cluster

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


                         Shard 1




                   Doc
            Doc     2
             1 Client
                         $ curl localhost:9200/twitter/_search?q=elasticsearch
                  CURL
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" : { ... }
                              } ]
                           }
La communauté




~100 contributeurs directs au projet (+ de 2800 watchers et + de 470 forks)
La communauté




~100 contributeurs directs au projet (+ de 2800 watchers et + de 470 forks)
Rejoignez le mouvement !
         @ElasticsearchFR
                                               www.elasticsearch.fr




       Questions ?
        Posez aussi vos questions sur elasticsearch-fr@googlegroups.com


Slides sur http://fr.slideshare.net/dadoonet    Sources sur https://github.com/dadoonet/talks

Contenu connexe

Tendances

Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab ElasticsearchDavid Pilato
 
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...Bruno Bonnin
 
A la recherche d'ElasticSearch
A la recherche d'ElasticSearchA la recherche d'ElasticSearch
A la recherche d'ElasticSearchNinnir
 
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 - workshopNuxeo
 
Elasticsearch - Devoxx France 2012
Elasticsearch - Devoxx France 2012Elasticsearch - Devoxx France 2012
Elasticsearch - Devoxx France 2012David Pilato
 
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__aymenzaafouriAymen ZAAFOURI
 
ElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementMohamed hedi Abidi
 
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 surXWikiKorteby Farouk
 
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 ElasticSearchfrancelabs
 
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/2014Silicon Comté
 
Jug algeria x wiki-atelier
Jug algeria x wiki-atelierJug algeria x wiki-atelier
Jug algeria x wiki-atelierAlgeria JUG
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewLudovic Piot
 
Introduction à ElasticSearch
Introduction à ElasticSearchIntroduction à ElasticSearch
Introduction à ElasticSearchFadel Chafai
 
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éesSOAT
 
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 pasPierre-Alban DEWITTE
 
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)Lucian Precup
 
[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 ?Sébastien Prunier
 
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...MongoDB
 

Tendances (20)

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...
 
A la recherche d'ElasticSearch
A la recherche d'ElasticSearchA la recherche d'ElasticSearch
A la recherche d'ElasticSearch
 
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
 
Elasticsearch - Devoxx France 2012
Elasticsearch - Devoxx France 2012Elasticsearch - Devoxx France 2012
Elasticsearch - Devoxx France 2012
 
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
 
ElasticSearch : Architecture et Développement
ElasticSearch : Architecture et DéveloppementElasticSearch : Architecture et Développement
ElasticSearch : Architecture et Développement
 
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
 
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
 
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
 
Jug algeria x wiki-atelier
Jug algeria x wiki-atelierJug algeria x wiki-atelier
Jug algeria x wiki-atelier
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overview
 
Introduction à ElasticSearch
Introduction à ElasticSearchIntroduction à ElasticSearch
Introduction à ElasticSearch
 
JSON-LD
JSON-LDJSON-LD
JSON-LD
 
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
 
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)
 
[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 ?
 
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...
 
Elasticsearch
ElasticsearchElasticsearch
Elasticsearch
 

Similaire à Lyon JUG - Elasticsearch

Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012David Pilato
 
Oxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide
 
Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Laurent Guérin
 
Développement d'un moteur de recherche avec Zend Search
Développement d'un moteur de recherche avec Zend SearchDéveloppement d'un moteur de recherche avec Zend Search
Développement d'un moteur de recherche avec Zend SearchRobert Viseur
 
[GAB2016] Azure DocumentDB - Jean-Luc Boucho
[GAB2016] Azure DocumentDB - Jean-Luc Boucho[GAB2016] Azure DocumentDB - Jean-Luc Boucho
[GAB2016] Azure DocumentDB - Jean-Luc BouchoCellenza
 
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 AZUG FR
 
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 CloudTugdual Grall
 
GraphTour - Workday: Tracking activity with Neo4j (French version)
GraphTour - Workday: Tracking activity with Neo4j (French version)GraphTour - Workday: Tracking activity with Neo4j (French version)
GraphTour - Workday: Tracking activity with Neo4j (French version)Neo4j
 
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 pasBruno Bonnin
 
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 - indexingMongoDB
 
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"parisraddicts
 
Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !VISEO
 
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 MobileIppon
 
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éJulien Dubois
 
Moteurs de recherche : un oeil sous le capot avec Elastic Search
Moteurs de recherche : un oeil sous le capot avec Elastic SearchMoteurs de recherche : un oeil sous le capot avec Elastic Search
Moteurs de recherche : un oeil sous le capot avec Elastic SearchAudrey Neveu
 
Jabes 2011 - Ateliers "Sudoc, Calames, thèses.fr et le web de données"
Jabes 2011 - Ateliers "Sudoc, Calames, thèses.fr et le web de données"Jabes 2011 - Ateliers "Sudoc, Calames, thèses.fr et le web de données"
Jabes 2011 - Ateliers "Sudoc, Calames, thèses.fr et le web de données"ABES
 

Similaire à Lyon JUG - Elasticsearch (20)

Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012
 
Oxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic Search
 
Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022Microservices-DDD-Telosys-Devoxx-FR-2022
Microservices-DDD-Telosys-Devoxx-FR-2022
 
Développement d'un moteur de recherche avec Zend Search
Développement d'un moteur de recherche avec Zend SearchDéveloppement d'un moteur de recherche avec Zend Search
Développement d'un moteur de recherche avec Zend Search
 
[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: 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
 
Elastic serach
Elastic serachElastic serach
Elastic serach
 
GraphTour - Workday: Tracking activity with Neo4j (French version)
GraphTour - Workday: Tracking activity with Neo4j (French version)GraphTour - Workday: Tracking activity with Neo4j (French version)
GraphTour - Workday: Tracking activity with Neo4j (French version)
 
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 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
 
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"
 
Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !Javascript as a first programming language : votre IC prête pour la révolution !
Javascript as a first programming language : votre IC prête pour la révolution !
 
NodeJs in real life
NodeJs in real lifeNodeJs in real life
NodeJs in real life
 
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
 
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é
 
GetText / Rails - FR
GetText / Rails - FRGetText / Rails - FR
GetText / Rails - FR
 
GetText / Rails
GetText / RailsGetText / Rails
GetText / Rails
 
Moteurs de recherche : un oeil sous le capot avec Elastic Search
Moteurs de recherche : un oeil sous le capot avec Elastic SearchMoteurs de recherche : un oeil sous le capot avec Elastic Search
Moteurs de recherche : un oeil sous le capot avec Elastic Search
 
Jabes 2011 - Ateliers "Sudoc, Calames, thèses.fr et le web de données"
Jabes 2011 - Ateliers "Sudoc, Calames, thèses.fr et le web de données"Jabes 2011 - Ateliers "Sudoc, Calames, thèses.fr et le web de données"
Jabes 2011 - Ateliers "Sudoc, Calames, thèses.fr et le web de données"
 

Plus de David Pilato

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...David Pilato
 
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 LuxembourgDavid Pilato
 
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...David Pilato
 
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 OsloDavid Pilato
 
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 EuropeDavid Pilato
 
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.ITDavid Pilato
 
Elasticsearch in 15 minutes
Elasticsearch in 15 minutesElasticsearch in 15 minutes
Elasticsearch in 15 minutesDavid Pilato
 
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!David Pilato
 
Elasticsearch - Devoxx France 2012 - English version
Elasticsearch - Devoxx France 2012 - English versionElasticsearch - Devoxx France 2012 - English version
Elasticsearch - Devoxx France 2012 - English versionDavid 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
 

Lyon JUG - Elasticsearch

  • 1. Elasticsearch. Le moteur de recherche élastique pour tous ! David Pilato, IDEO Technologies, Paris Tanguy Leroux, ZENIKA, Lyon
  • 2. Qui ? $ curl http://localhost:9200/talk/speaker/tlrx { "nom" : "Tanguy Leroux", "jobs" : [ { "boite" : "SQLi", "mission" : "Chef de projet technique", "duree" : 7 }, { "boite" : "Zenika", "mission" : "Architecte JEE", "duree" : 1 } ], "passions" : [ "java", "oenologie", "vtt" ], "blog" : "http://blog.zenika.com/", "twitter" : [ "@tlrx" ], "email" : "tanguy.leroux@gmail.com" }
  • 3. Qui ? $ curl http://localhost:9200/talk/speaker/tlrx { "nom" : "Tanguy Leroux", "jobs" : [ { "boite" : "SQLi", "mission" : "Chef de projet technique", "duree" : 7 }, { "boite" : "Zenika", "mission" : "Architecte JEE", "duree" : 1 } ], "passions" : [ "java", "oenologie", "vtt" ], "blog" : "http://blog.zenika.com/", "twitter" : [ "@tlrx" ], "email" : "tanguy.leroux@gmail.com" }
  • 4. Qui ? $ curl http://localhost:9200/talk/speaker/dpilato { "nom" : "David Pilato", "jobs" : [ { "boite" : "SRA Europe (SSII)", "mission" : "bon à tout faire", "duree" : 3 }, { "boite" : "SFR", "mission" : "touche à tout", "duree" : 3 }, { "boite" : "e-Brands / Vivendi", "mission" : "chef de projets", "duree" : 4 }, { "boite" : "DGDDI (douane)", "mission" : "mouton à 5 pattes", "duree" : 8 }, { "boite" : "IDEO Technologies", "mission" : "directeur technique", "duree" : 0 } ], "passions" : [ "famille", "job", "deejay" ], "blog" : "http://dev.david.pilato.fr/", "twitter" : [ "@dadoonet", "@elasticsearchfr", "@scrutmydocs" ], "email" : "david@pilato.fr" }
  • 5. Qui ? $ curl http://localhost:9200/talk/speaker/dpilato { "nom" : "David Pilato", "jobs" : [ { "boite" : "SRA Europe (SSII)", "mission" : "bon à tout faire", "duree" : 3 }, { "boite" : "SFR", "mission" : "touche à tout", "duree" : 3 }, { "boite" : "e-Brands / Vivendi", "mission" : "chef de projets", "duree" : 4 }, { "boite" : "DGDDI (douane)", "mission" : "mouton à 5 pattes", "duree" : 8 }, { "boite" : "IDEO Technologies", "mission" : "directeur technique", "duree" : 0 } ], "passions" : [ "famille", "job", "deejay" ], "blog" : "http://dev.david.pilato.fr/", "twitter" : [ "@dadoonet", "@elasticsearchfr", "@scrutmydocs" ], "email" : "david@pilato.fr" }
  • 7. Pour la démo Faites du bruit sur Twitter avec le hashtag #elasticsearch
  • 8. SQL Classique Cherche moi un document de décembre 2011 portant sur la france et contenant tanguy et david En SQL :
  • 9. SQL Classique Cherche moi un document de décembre 2011 portant sur la france et contenant tanguy 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 ‘%tanguy%' AND lower(doc.commentaire) LIKE ‘%david%';
  • 10. Les limites de la recherche SQL • En général, on se limite aux champs figés ou codifiés • Pas de tolérance aux fotes de frappe • Performances désastreuses sur du like % sur des millions de ligne • Plombe les performances de l’insertion • Recherche « google » impossible !
  • 11. Au final, on obtient • Autrement dit : tu as intérêt à savoir ce que tu cherches ! • Fouiller est interdit !
  • 12. 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 !
  • 14. Elasticsearch Your Data, your Search !
  • 15. 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 !
  • 16. 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, …
  • 17. 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" • Type : Regroupe des documents de même type • Index : Espace logique de stockage des documents dont les types sont fonctionnellement communs
  • 18. 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 #lyonjug", "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": "lyonjug", "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
  • 19. 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 #lyonjug", "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": "lyonjug", "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
  • 20. 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 #lyonjug", "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": "lyonjug", "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
  • 22. Interagir avec Elasticsearch • API REST : http://host:port/[index]/[type]/[_action/id] Méthodes HTTP : GET, POST, PUT, DELETE
  • 23. Interagir avec Elasticsearch • API REST : http://host:port/[index]/[type]/[_action/id] Méthodes HTTP : GET, POST, PUT, DELETE • Documents • curl -XPUT http://localhost:9200/twitter/tweet/1
  • 24. Interagir avec Elasticsearch • API REST : http://host:port/[index]/[type]/[_action/id] Méthodes HTTP : GET, POST, PUT, DELETE • Documents • curl -XPUT http://localhost:9200/twitter/tweet/1 • curl -XGET http://localhost:9200/twitter/tweet/1
  • 25. Interagir avec Elasticsearch • API REST : http://host:port/[index]/[type]/[_action/id] Méthodes HTTP : GET, POST, PUT, DELETE • Documents • curl -XPUT http://localhost:9200/twitter/tweet/1 • curl -XGET http://localhost:9200/twitter/tweet/1 • curl -XDELETE http://localhost:9200/twitter/tweet/1
  • 26. Interagir avec Elasticsearch • API REST : http://host:port/[index]/[type]/[_action/id] Méthodes HTTP : GET, POST, PUT, DELETE • Documents • curl -XPUT http://localhost:9200/twitter/tweet/1 • curl -XGET http://localhost:9200/twitter/tweet/1 • curl -XDELETE http://localhost:9200/twitter/tweet/1 • Recherche • curl -XPOST http://localhost:9200/twitter/tweet/_search
  • 27. Interagir avec Elasticsearch • API REST : http://host:port/[index]/[type]/[_action/id] Méthodes HTTP : GET, POST, PUT, DELETE • Documents • curl -XPUT http://localhost:9200/twitter/tweet/1 • curl -XGET http://localhost:9200/twitter/tweet/1 • curl -XDELETE http://localhost:9200/twitter/tweet/1 • Recherche • curl -XPOST http://localhost:9200/twitter/tweet/_search • curl -XPOST http://localhost:9200/twitter/_search
  • 28. Interagir avec Elasticsearch • API REST : http://host:port/[index]/[type]/[_action/id] Méthodes HTTP : GET, POST, PUT, DELETE • Documents • curl -XPUT http://localhost:9200/twitter/tweet/1 • curl -XGET http://localhost:9200/twitter/tweet/1 • curl -XDELETE http://localhost:9200/twitter/tweet/1 • Recherche • curl -XPOST http://localhost:9200/twitter/tweet/_search • curl -XPOST http://localhost:9200/twitter/_search • curl -XPOST http://localhost:9200/_search
  • 29. 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
  • 30. 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
  • 31. Indexer $ curl -XPUT localhost:9200/twitter/tweet/1 -d ' { "text": "Bienvenue à la conférence #elasticsearch pour #lyonjug", "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": "lyonjug", "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 !" } }'
  • 32. Indexer $ curl -XPUT localhost:9200/twitter/tweet/1 -d ' { "text": "Bienvenue à la conférence #elasticsearch pour #lyonjug", "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": "lyonjug", "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" }
  • 34. Chercher $ curl localhost:9200/twitter/tweet/_search?q=elasticsearch { "took" : 24, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.227, "hits" : [ { "_index" : "twitter", "_type" : "tweet", "_id" : "1", "_score" : 0.227, "_source" : { "text": "Bienvenue à la conférence #elasticsearch pour #lyonjug", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", […] } } ] } }
  • 35. Chercher $ curl localhost:9200/twitter/tweet/_search?q=elasticsearch { "took" : 24, Nb de "timed_out" : false, documents "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.227, "hits" : [ { "_index" : "twitter", "_type" : "tweet", "_id" : "1", "_score" : 0.227, "_source" : { "text": "Bienvenue à la conférence #elasticsearch pour #lyonjug", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", […] } } ] } }
  • 36. Chercher $ curl localhost:9200/twitter/tweet/_search?q=elasticsearch { "took" : 24, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.227, "hits" : [ { Coordonnées "_index" : "twitter", "_type" : "tweet", "_id" : "1", "_score" : 0.227, "_source" : { "text": "Bienvenue à la conférence #elasticsearch pour #lyonjug", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", […] } } ] } }
  • 37. Chercher $ curl localhost:9200/twitter/tweet/_search?q=elasticsearch { "took" : 24, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1, "max_score" : 0.227, "hits" : [ { "_index" : "twitter", "_type" : "tweet", "_id" : "1", "_score" : 0.227, "_source" : { "text": "Bienvenue à la conférence #elasticsearch pour #lyonjug", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", […] } Pertinence } ] } }
  • 38. Chercher $ curl localhost:9200/twitter/tweet/_search?q=elasticsearch { "took" : 24, "timed_out" : false, "_shards" : { "total" : 5, "successful" : 5, "failed" : 0 }, "hits" : { "total" : 1, Document "max_score" : 0.227, "hits" : [ { source "_index" : "twitter", "_type" : "tweet", "_id" : "1", "_score" : 0.227, "_source" : { "text": "Bienvenue à la conférence #elasticsearch pour #lyonjug", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", […] } } ] } }
  • 39. 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
  • 40. Query DSL • Requêtes précises : plutôt que de chercher « à la google », on peut utiliser des critères précis :
  • 41. 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" } } ] } }’
  • 42. Injecter les données Et au milieu coule une rivière
  • 44. La collecte Stockage Données
  • 45. La collecte Doc Stockage Données
  • 46. La collecte Stockage Données Doc
  • 47. La collecte Doc Stockage Données Doc
  • 48. La collecte Stockage Données Doc Doc
  • 49. La collecte Stockage Données Doc Doc
  • 50. La collecte Stockage Données Doc Doc
  • 51. La collecte Stockage Données Doc Doc
  • 52. La collecte Doc Stockage Données Doc Doc
  • 53. La collecte Stockage Données Doc Doc
  • 54. La collecte Stockage Données Doc Doc
  • 57. Quelques Rivers... • CouchDB River • MongoDB River
  • 58. Quelques Rivers... • CouchDB River • MongoDB River • JDBC River
  • 59. Quelques Rivers... • CouchDB River • MongoDB River • JDBC River • Wikipedia River
  • 60. Quelques Rivers... • CouchDB River • MongoDB River • JDBC River • Wikipedia River • Twitter River
  • 61. Quelques Rivers... • CouchDB River • MongoDB River • JDBC River • Wikipedia River • Twitter River • RabbitMQ River
  • 62. Quelques Rivers... • CouchDB River • MongoDB River • JDBC River • Wikipedia River • Twitter River • RabbitMQ River • ActiveMQ River
  • 63. Quelques Rivers... • CouchDB River • MongoDB River • JDBC River • Wikipedia River • Twitter River • RabbitMQ River • ActiveMQ River • RSS River
  • 64. Quelques Rivers... • CouchDB River • MongoDB River • JDBC River • Wikipedia River • Twitter River • RabbitMQ River • ActiveMQ River • RSS River • LDAP River
  • 65. Quelques Rivers... • CouchDB River • MongoDB River • JDBC River • Wikipedia River • Twitter River • RabbitMQ River • ActiveMQ River • RSS River • LDAP River • FS River
  • 66. Quelques Rivers... • CouchDB River • MongoDB River • JDBC River • Wikipedia River • Twitter River • RabbitMQ River • ActiveMQ River • RSS River • LDAP River • FS River • Dropbox River
  • 67. Quelques Rivers... • CouchDB River • MongoDB River • JDBC River • Wikipedia River • Twitter River • RabbitMQ River • ActiveMQ River • RSS River • LDAP River • FS River • Dropbox River • Dick Rivers
  • 68. 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 !)
  • 69. Des tweets ID Username Date Hashtag 1 dadoonet 2012-04-18 1 2 tlrx 2012-04-18 5 3 elasticsearch 2012-04-18 2 4 dadoonet 2012-04-18 2 5 tlrx 2012-04-18 6 6 elasticsearch 2012-04-19 3 7 dadoonet 2012-04-19 3 8 tlrx 2012-04-19 7 9 elasticsearch 2012-04-20 4
  • 70. Term Facet D Username Date Hashtag 1 dadoonet 2012-04-18 1 2 tlrx 2012-04-18 5 3 elasticsearch 2012-04-18 2 4 dadoonet 2012-04-18 2 5 tlrx 2012-04-18 6 6 elasticsearch 2012-04-19 3 7 dadoonet 2012-04-19 3 8 tlrx 2012-04-19 7 9 elasticsearch 2012-04-20 4
  • 71. Term Facet D Username Date Hashtag 1 dadoonet 2012-04-18 1 2 tlrx 2012-04-18 5 3 elasticsearch 2012-04-18Username 2 Count 4 dadoonet 2012-04-18dadoonet 2 3 5 tlrx 2012-04-18 tlrx 6 3 6 elasticsearch 2012-04-19 elasticsearch 3 3 7 dadoonet 2012-04-19 3 8 tlrx 2012-04-19 7 9 elasticsearch 2012-04-20 4
  • 72. Term Facet D Username Date Hashtag 1 dadoonet 2012-04-18 1 2 tlrx 2012-04-18 5 3 elasticsearch 2012-04-18 2 4 dadoonet 2012-04-18 2 5 tlrx 2012-04-18 6 6 elasticsearch 2012-04-19 3 7 dadoonet 2012-04-19 3 8 tlrx 2012-04-19 7 9 elasticsearch 2012-04-20 4
  • 73. Term Facet D Username Date Hashtag 1 dadoonet 2012-04-18 "facets" : { 1 "users" : { "terms" : {"field" : "username"} } } 2 tlrx 2012-04-18 5 3 elasticsearch 2012-04-18 2 4 dadoonet 2012-04-18 2 5 tlrx 2012-04-18 6 6 elasticsearch 2012-04-19 3 7 dadoonet 2012-04-19 3 8 tlrx 2012-04-19 7 9 elasticsearch 2012-04-20 4
  • 74. Term Facet D Username Date Hashtag 1 dadoonet 2012-04-18 "facets" : { 1 "users" : { "terms" : {"field" : "username"} } } 2 tlrx 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 tlrx 2012-04-18"other": 0, 6 "terms" : [ 6 elasticsearch 2012-04-19 { "term" : "dadoonet", "count" },3 }, 3 { "term" : "tlrx", "count" : 3 : { "term" : "elasticsearch", "count" : 3 } 7 dadoonet 2012-04-19] 3 } 8 tlrx 2012-04-19 } 7 9 elasticsearch 2012-04-20 4
  • 75. Date Histogram Facet Date Hashtag 2012-04-18 1 2012-04-18 5 h 2012-04-18 2 2012-04-18 2 2012-04-18 6 h 2012-04-19 3 2012-04-19 3 2012-04-19 7 h 2012-04-20 4
  • 76. 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 h 2012-04-19 3 2012-04-19 3 2012-04-19 7 h 2012-04-20 4
  • 77. 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
  • 78. Date Histogram Facet Date Hashtag 2012-04-18 1 2012-04-18 5 h 2012-04-18 2 2012-04-18 2 2012-04-18 6 h 2012-04-19 3 2012-04-19 3 2012-04-19 7 h 2012-04-20 4
  • 79. Date Histogram Facet Date Hashtag "facets" : { 2012-04-18 1 "perday" : { "date_histogram" : { 2012-04-18 5 "field" : "date", "interval" : "day" } h 2012-04-18 2 } } 2012-04-18 2 2012-04-18 6 h 2012-04-19 3 2012-04-19 3 2012-04-19 7 h 2012-04-20 4
  • 80. 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
  • 81. Range Facet Hashtag 1 5 2 2 6 3 3 7 4
  • 82. 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
  • 83. Range Facet Hashtag 1 5 2 2 6 3 3 7 4
  • 84. Range Facet "facets" : { "hashtags" : { "range" : { "field" : "hashtag", "ranges" : [ { "to" : 3 }, Hashtag { "from" : 3, "to" : 5 }, { "from" : 5 } ] } } } 1 5 2 2 6 3 3 7 4
  • 85. 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 } ] } }
  • 90. Site marchand Ranges Term Term Ranges
  • 91. 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
  • 93. Reprenons notre formulaire
  • 94. Reprenons notre formulaire Recherche Full Text
  • 95. Reprenons notre formulaire
  • 96. Reprenons notre formulaire
  • 100. Architecture Twitter Streaming API
  • 101. Architecture Twitter Streaming API
  • 102. Architecture Twitter Twitter Streaming River API $ curl -XPUT localhost:9200/_river/twitter/_meta -d ' { "type" : "twitter", "twitter" : { "user" : "twitter_user", "password" : "twitter_password", "filter" : { "tracks" : ["elasticsearch"] } } }'
  • 103. 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"] } } }'
  • 104. Architecture Un peu plus de technique : partitions / réplications / scalabilité
  • 106. Lexique • Nœud (node) : Une instance d'Elasticsearch (~ machine ?)
  • 107. Lexique • Nœud (node) : Une instance d'Elasticsearch (~ machine ?) • Cluster : Un ensemble de nœuds
  • 108. 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
  • 109. 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
  • 110. Lexique • Nœud (node) : Une instance d'Elasticsearch (~ machine ?) • Cluster : Un ensemble de nœuds • Partition (shard) : permet de découper un index en plusieurs parties pour y distribuer les documents • Réplication (replica) : recopie d’une partition en une ou plusieurs copies dans l'ensemble du cluster • Partition primaire (primary shard) : partition élue "principale" dans l'ensemble du cluster. C'est là que se fait l'indexation par Lucene. Il n'y en a qu'une seule par shard dans l'ensemble du cluster.
  • 111. Lexique • Nœud (node) : Une instance d'Elasticsearch (~ machine ?) • Cluster : Un ensemble de nœuds • Partition (shard) : permet de découper un index en plusieurs parties pour y distribuer les documents • Réplication (replica) : recopie d’une partition en une ou plusieurs copies dans l'ensemble du cluster • Partition primaire (primary shard) : partition élue "principale" dans l'ensemble du cluster. C'est là que se fait l'indexation par Lucene. Il n'y en a qu'une seule par shard dans l'ensemble du cluster. • Partition secondaire (secondary shard) : partitions secondaires stockant les replicas des partitions primaires.
  • 112. Créons un index Cluster Nœud 1 Client CURL
  • 113. Créons un index $ curl -XPUT localhost:9200/twitter -d '{ Cluster "index" : { Nœud 1 "number_of_shards" : 2, "number_of_replicas" : 1 Shard 0 } Shard 1 }' réplication non respectée Client CURL
  • 114. Créons un index $ curl -XPUT localhost:9200/twitter -d '{ Cluster "index" : { Nœud 1 Nœud 2 "number_of_shards" : 2, "number_of_replicas" : 1 Shard 0 Shard 0 } }' Shard 1 Shard 1 réplication respectée Client CURL
  • 115. Réallocation dynamique Cluster Nœud 1 Nœud 2 Shard 0 Shard 0 Shard 1 Shard 1
  • 116. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Shard 0 Shard 0 Shard 1 Shard 1
  • 117. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Shard 0 Shard 0 Shard 0 Shard 1 Shard 1
  • 118. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Shard 0 Shard 0 Shard 1 Shard 1
  • 119. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Shard 0 Shard 0 Shard 1 Shard 1
  • 120. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Nœud 4 Shard 0 Shard 0 Shard 1 Shard 1
  • 121. 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
  • 122. Réallocation dynamique Cluster Nœud 1 Nœud 2 Nœud 3 Nœud 4 Shard 0 Shard 0 Shard 1 Shard 1 Le tuning, c'est trouver le bon équilibre entre le nombre de nodes, shards et replicas !
  • 123. 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 #lyonjug", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", ... }'
  • 124. 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 #lyonjug", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", ... }'
  • 125. 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 #lyonjug", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", ... }'
  • 126. 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 #lyonjug", "created_at": "2012-04-06T20:45:36.000Z", "source": "Twitter for iPad", ... }'
  • 127. 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 à #lyonjug", "created_at": "2012-04-06T21:12:52.000Z", "source": "Twitter for iPad", ... }'
  • 128. 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 à #lyonjug", "created_at": "2012-04-06T21:12:52.000Z", "source": "Twitter for iPad", ... }'
  • 129. 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 à #lyonjug", "created_at": "2012-04-06T21:12:52.000Z", "source": "Twitter for iPad", ... }'
  • 130. 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 à #lyonjug", "created_at": "2012-04-06T21:12:52.000Z", "source": "Twitter for iPad", ... }'
  • 131. 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 à #lyonjug", "created_at": "2012-04-06T21:12:52.000Z", "source": "Twitter for iPad", ... }'
  • 132. 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
  • 133. 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
  • 134. 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
  • 135. 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 2 Doc Doc 2 1 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL
  • 136. 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" : { ... } } ] }
  • 137. 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
  • 138. 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
  • 139. 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
  • 140. Cherchons encore ! Cluster Nœud 1 Nœud 2 Nœud 3 Doc Shard 0 1 Shard 0 Doc 1 Shard 1 Doc 2 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL
  • 141. Cherchons encore ! Cluster Nœud 1 Nœud 2 Nœud 3 Doc Shard 0 1 Shard 0 Doc 1 Shard 1 Doc 2 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL
  • 142. 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
  • 143. Cherchons encore ! Cluster Nœud 1 Nœud 2 Nœud 3 Doc Shard 0 1 Shard 0 Shard 1 Doc Doc 2 1 Client $ curl localhost:9200/twitter/_search?q=elasticsearch CURL
  • 144. 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" : { ... } } ] }
  • 145. La communauté ~100 contributeurs directs au projet (+ de 2800 watchers et + de 470 forks)
  • 146. La communauté ~100 contributeurs directs au projet (+ de 2800 watchers et + de 470 forks)
  • 147.
  • 148. Rejoignez le mouvement ! @ElasticsearchFR www.elasticsearch.fr Questions ? Posez aussi vos questions sur elasticsearch-fr@googlegroups.com Slides sur http://fr.slideshare.net/dadoonet Sources sur https://github.com/dadoonet/talks

Notes de l'éditeur

  1. David\n
  2. Tanguy\n
  3. David\n
  4. David\n
  5. David\n
  6. David\n
  7. David\n
  8. David\n
  9. David\n
  10. David\n
  11. David\n
  12. David\n
  13. David\n
  14. David\n
  15. David\n
  16. David\n
  17. David\n
  18. David\n
  19. David\n
  20. David\n
  21. David\n
  22. David\n
  23. David\n
  24. David\n
  25. David\n
  26. David\n
  27. David\n
  28. David\n
  29. David\n
  30. David\n
  31. David\n
  32. David\n
  33. David\n
  34. David\n
  35. David\n
  36. David\n
  37. David\n
  38. David\n
  39. David\n
  40. David\n
  41. David\n
  42. David\n
  43. David\n
  44. David\n
  45. David\n
  46. David\n
  47. Tanguy\n
  48. Tanguy\n
  49. Tanguy\n
  50. Tanguy\n
  51. Tanguy\n
  52. Tanguy\n
  53. Tanguy\n
  54. Tanguy\n
  55. Tanguy\n
  56. Tanguy\n
  57. Tanguy\n
  58. Tanguy\n
  59. Tanguy\n
  60. Tanguy\n
  61. Tanguy\n
  62. Tanguy\n
  63. Tanguy\n
  64. Tanguy\n
  65. Tanguy\n
  66. Tanguy\n
  67. Tanguy\n
  68. Tanguy\n
  69. Tanguy\n
  70. Tanguy\n
  71. Tanguy\n
  72. Tanguy\n
  73. Tanguy\n
  74. Tanguy\n
  75. Tanguy\n
  76. Tanguy\n
  77. Tanguy\n
  78. Tanguy\n
  79. Tanguy\n
  80. Tanguy\n
  81. Tanguy\n
  82. Tanguy\n
  83. Tanguy\n
  84. Tanguy\n
  85. Tanguy\n
  86. Tanguy\n
  87. Tanguy\n
  88. Tanguy\n
  89. Tanguy\n
  90. Tanguy\n
  91. Tanguy\n
  92. Tanguy\n
  93. David\n
  94. David\n
  95. David\n
  96. David\n
  97. David\n
  98. David\n
  99. David\n
  100. David\n
  101. David\n
  102. David\n
  103. David\n
  104. David\n
  105. David\n
  106. David\n
  107. David\n
  108. David\n
  109. David\n
  110. David\n
  111. David\n
  112. David\n
  113. David\n
  114. David\n
  115. David\n
  116. David\n
  117. David\n
  118. David\n
  119. David\n
  120. David\n
  121. David\n
  122. David\n
  123. David\n
  124. David\n
  125. David\n
  126. David\n
  127. David\n
  128. David\n
  129. David\n
  130. David\n
  131. David\n
  132. David\n
  133. David\n
  134. David\n
  135. David\n
  136. David puis Tanguy pour la d&amp;#xE9;mo\n
  137. David puis Tanguy pour la d&amp;#xE9;mo\n
  138. David puis Tanguy pour la d&amp;#xE9;mo\n
  139. David puis Tanguy pour la d&amp;#xE9;mo\n
  140. David puis Tanguy pour la d&amp;#xE9;mo\n
  141. David puis Tanguy pour la d&amp;#xE9;mo\n
  142. David puis Tanguy pour la d&amp;#xE9;mo\n
  143. David puis Tanguy pour la d&amp;#xE9;mo\n
  144. David puis Tanguy pour la d&amp;#xE9;mo\n
  145. David puis Tanguy pour la d&amp;#xE9;mo\n
  146. David puis Tanguy pour la d&amp;#xE9;mo\n
  147. Tanguy\n
  148. Tanguy\n
  149. Tanguy\n
  150. Tanguy\n
  151. Tanguy\n
  152. Tanguy\n
  153. Tanguy\n
  154. Tanguy\n
  155. Tanguy\n
  156. Tanguy\n
  157. Tanguy\n
  158. Tanguy\n
  159. Tanguy\n
  160. Tanguy\n
  161. Tanguy\n
  162. Tanguy\n
  163. Tanguy\n
  164. Tanguy\n
  165. Tanguy\n
  166. Tanguy\n
  167. Tanguy\n
  168. Tanguy\n
  169. Tanguy\n
  170. Tanguy\n
  171. Tanguy\n
  172. Tanguy\n
  173. Tanguy\n
  174. Tanguy\n
  175. Tanguy\n
  176. Tanguy\n
  177. Tanguy\n
  178. Tanguy\n
  179. Tanguy\n
  180. Tanguy\n
  181. Tanguy\n
  182. Tanguy\n
  183. Tanguy\n
  184. Tanguy\n
  185. Tanguy\n
  186. Tanguy\n
  187. Tanguy\n
  188. David\n
  189. David\n
  190. David\n
  191. David\n
  192. David\n
  193. David\n
  194. David\n
  195. David\n
  196. David\n
  197. David\n
  198. David\n
  199. David\n
  200. David\n
  201. David\n
  202. David\n
  203. David\n
  204. David\n
  205. David\n
  206. David\n
  207. David\n
  208. David\n
  209. David\n
  210. David\n
  211. David\n
  212. David\n
  213. David\n
  214. David\n
  215. David\n
  216. David\n
  217. David\n
  218. David\n
  219. David\n
  220. David\n
  221. David\n
  222. David\n
  223. David\n
  224. David\n
  225. David\n
  226. David\n
  227. David\n
  228. David\n
  229. David\n
  230. David\n