SlideShare une entreprise Scribd logo
Hands On Elasticsearch
    Malloum Laya / David Pilato
Qui ?
      $ curl http://localhost:9200/talk/speaker/TheMalloum
{
    "nom" : "Malloum Laya",
    "jobs" : [
     { "boite" : "Logica", "mission" : "développeur", "duree" : 3 },
     { "boite" : "DGDDI (douane)", "mission" : "chef de projets", "duree" : 4 } ],
    "passions" : [ "famille", "informatique", "rap français" ],
    "blog" : "http://malloum.fr/",
    "twitter" : [ "@TheMalloum", "@scrutmydocs" ],
    "email" : "malloum.laya@gmail.com"
}
Qui ?
      $ curl http://localhost:9200/talk/speaker/TheMalloum
{
    "nom" : "Malloum Laya",
    "jobs" : [
     { "boite" : "Logica", "mission" : "développeur", "duree" : 3 },
     { "boite" : "DGDDI (douane)", "mission" : "chef de projets", "duree" : 4 } ],
    "passions" : [ "famille", "informatique", "rap français" ],
    "blog" : "http://malloum.fr/",
    "twitter" : [ "@TheMalloum", "@scrutmydocs" ],
    "email" : "malloum.laya@gmail.com"
}
Qui ?
      $ curl http://localhost:9200/talk/speaker/TheMalloum
{
    "nom" : "Malloum Laya",
    "jobs" : [
     { "boite" : "Logica", "mission" : "développeur", "duree" : 3 },
     { "boite" : "DGDDI (douane)", "mission" : "chef de projets", "duree" : 4 } ],
    "passions" : [ "famille", "informatique", "rap français" ],
    "blog" : "http://malloum.fr/",
    "twitter" : [ "@TheMalloum", "@scrutmydocs" ],
    "email" : "malloum.laya@gmail.com"
}




      $ 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"
}
Agenda
Agenda

Aperçu d'Elasticsearch

Atelier 1 : indexons

Atelier 2 : cherchons

Atelier 3 : analysons
Elasticsearch
 Les fondamentaux
Un moteur de
        recherche


un moteur d’indexation de "documents"

un moteur de recherche sur les index
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 avec distribution,
réplication, fail over

Très performant : distribution des calculs sur plusieurs nœuds

C’est un moteur, pas une interface graphique !
Penser document !
Changement de paradigme :

  On ne pense plus SQL !

  On indexe ce qu'on veut trouver !

Un document, c'est :

  Un objet JSON

  Des propriétés simples (String, boolean, number)

  Des propriétés complexes (array, object)

  Des propriétés évoluées (geoloc, binary, attachments)
Ranger ses
                          documents
{
  "text": "Bienvenue au Hands On Lab #elasticsearch pour #jduchess",
  "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": "jduchess", "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 !" }
}


       Elasticsearch met à notre disposition

           Des types de document

           Des index

       Le document 1 de type Tweet dans l’index Twitter
Agir 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 -d ‘{....}’
 •   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 -d ‘{....}’
 •   curl -XPOST http://localhost:9200/twitter/_search -d ‘{....}’
 •   curl -XPOST http://localhost:9200/_search -d ‘{....}’

Meta données Elasticsearch

 •   curl -XGET http://localhost:9200/twitter/_status
 •   curl -XPOST http://localhost:9200/_shutdown
Atelier 0
On prépare le terrain
Quelques notions
Quelques notions


• Nœud (node) : Une instance d'Elasticsearch (~ machine ?)
Quelques notions


• Nœud (node) : Une instance d'Elasticsearch (~ machine ?)
• Cluster : Un ensemble de nœuds
Quelques notions


• 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
Quelques notions


• 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
Agir en Java
// Création du noeud. Il s’agit d’une instance d’Elasticsearch complète !
Node node = NodeBuilder.nodeBuilder().node();

// Les opérations courantes (put, get, search, delete)
// se font à l’aide d’un client !
Client client = node.client();

// On peut aussi faire des opérations d’administration
// (état du cluster, suppression index, ...) !
AdminClient client = client.admin();
Atelier 0
Récupérer la distribution Elasticsearch
ES 0.19.9, elasticsearch.yml modifié, plugins : MOBZ Head, BigDesk, Paramedic
curl -OL -k https://github.com/downloads/elasticsearchfr/hands-on/elasticsearch-0.19.9-
handson.zip



Cloner le repository
git clone https://github.com/elasticsearchfr/hands-on.git



Regarder les sources du test 0
src/test/java/org/elasticsearchfr/handson/ex0/NodeTest.java



Instructions dans la javadoc et
https://github.com/elasticsearchfr/hands-on#test-0-just-start-a-node
Atelier 1
On indexe des bières ;-)
Indexer en Java
// On peut fabriquer du json à la main
String json = "{ "field":"value" }";

// En utilisant le XContent d’Elasticsearch
XContentBuilder xcb = XContentFactory.jsonBuilder()
    .startObject()
         .field("field", "value")
    .endObject();
String json = xcb.toString();

// Sérialiser JavaBean en JSon
// On peut utiliser Jackson : http://wiki.fasterxml.com/JacksonHome
Beer beer = new Beer("Heineken", Colour.PALE, 0.33, 3);
ObjectMapper mapper = new ObjectMapper();
String json = mapper.writeValueAsString(beer);

// On peut indexer !
client.prepareIndex("index", "type").setSource(json).execute().actionGet();
client.prepareIndex("index", "type", "id").setSource(xcb).execute().actionGet();

// Insérer en mode Bulk
BulkRequestBuilder brb = client.prepareBulk();

// Ajouter des actions à réaliser
brb.add(new IndexRequest("index", "type").source(json));

// Exécuter le bulk
brb.execute().actionGet();
Récupérer en Java
// Récupérer
GetResponse gr = client.prepareGet("index", "type", "id").execute().actionGet();

// Désérialiser de JSon vers JavaBean
ObjectMapper mapper = new ObjectMapper();
Beer beer = mapper.readValue(gr.getSourceAsBytes(), Beer.class);
Effacer en Java
// Effacer
client.prepareDelete("index", "type", "id").execute().actionGet();



// Effacer en mode Bulk
BulkRequestBuilder brb = client.prepareBulk();

// Ajouter des actions à réaliser
brb.add(new DeleteRequest("index", "type", "id"));

// Exécuter le bulk
brb.execute().actionGet();
Atelier 1


Regarder les sources du test 1
src/test/java/org/elasticsearchfr/handson/ex1/IndexTest.java



Instructions dans la javadoc et
https://github.com/elasticsearchfr/hands-on#test-1-indexget-and-delete-some-documents
Atelier 2
On cherche des bières ;-)
Query DSL
   Type                                             Description



 Match All    Recherche tout le contenu



QueryString   Recherche « à la google » : syntaxe Lucene possible +, -, FROM, TO, ^



   Bool       Recherche multi-critères (MUST, MUST NOT, SHOULD)



   Term       Recherche d'un terme précis dans un champ donné



  Match       Recherche « à la google » dans le contenu d’un champ



  Range       Recherche par intervalle (>, >=, <, <=) dans un champ
Chercher en Java
// Fabriquer un QueryBuilder (qb)
// MatchAll
QueryBuilder qb = QueryBuilders.matchAllQuery();

// TermQuery
QueryBuilder qb = QueryBuilders.termQuery("field", "value");

// MatchQuery
QueryBuilder qb = QueryBuilders.matchQuery("field", "you can enter a text here");

// QueryString
QueryBuilder qb = QueryBuilders.queryString("you can enter a text here");

// RangeQuery
QueryBuilder qb = QueryBuilders.rangeQuery("field").from(5).to(10);

// BoolQuery
QueryBuilder qb = QueryBuilders.boolQuery()
	 .must(QueryBuilders.termQuery("field1", "value"))
	 .mustNot(QueryBuilders.termQuery("field2", "value"))
	 .should(QueryBuilders.rangeQuery("field3").from(0).to(5));
Les résultats
// Lancer une recherche
SearchResponse sr = client.prepareSearch().setQuery(qb).execute().actionGet();

// Récupérer le temps d’exécution
long execTime = sr.getTookInMillis();

// Récupérer le nombre de hits
long nbHits = sr.getHits().getTotalHits();

// Récupérer les hits
SearchHit[] hits = sr.getHits().getHits();
SearchHit hit = hits[0];

// Récupérer les coordonnées du document
hit.getIndex();
hit.getType();
hit.getId();

// Récupérer la pertinence du document
hit.getScore();

// Récupérer le document source au format Json
hit.getSourceAsString();
Atelier 2


Regarder les sources du test 2
src/test/java/org/elasticsearchfr/handson/ex2/SearchTest.java



Instructions dans la javadoc et
https://github.com/elasticsearchfr/hands-on#test-2-searching-for-documents
Atelier 3
La bière vue sous un autre angle
          Les facettes
Les facettes

ID    Marque      Taille   Prix
1     Heineken    0.25     3.50
2    Grimbergen   0.25     4.00
3      Kriek      0.25     3.80
4     Heineken     0.5     6.80
5    Grimbergen    0.5     7.80
6      Kriek       0.5     7.50
7     Heineken      1      12.00
8    Grimbergen     1      14.00
9      Kriek        1      14.00
Term Facet

ID    Marque      Taille   Prix
1     Heineken    0.25     3.50
2    Grimbergen   0.25     4.00
3      Kriek      0.25     3.80
4     Heineken     0.5     6.80
5    Grimbergen    0.5     7.80
6      Kriek       0.5     7.50
7     Heineken      1      12.00
8    Grimbergen     1      14.00
9      Kriek        1      14.00
Term Facet

ID    Marque      Taille                 Prix
1     Heineken    0.25                   3.50
2    Grimbergen   0.25                   4.00
3      Kriek      0.25 Marque      Count3.80
4     Heineken     0.5 Heineken      3 6.80
5    Grimbergen    0.5Grimbergen     3   7.80
6      Kriek       0.5 Kriek         3   7.50
7     Heineken      1                    12.00
8    Grimbergen     1                    14.00
9      Kriek        1                    14.00
TermFacet en Java
// Fabriquer une TermFacet (facet)
AbstractFacetBuilder facet = FacetBuilders.termsFacet("bybrand").field("marque");

// Avec la recherche
SearchResponse sr = client.prepareSearch()
     .setQuery(qb)
     .addFacet(facet)
  .execute().actionGet();

// Facette en retour
TermsFacet bybrand = sr.getFacets().facet("bybrand");
for (TermsFacet.Entry entry : bybrand) {
   String marque = entry.getTerm();
   int nb = entry.count();
}
Range Facet

ID    Marque      Taille   Prix
1     Heineken    0.25     3.50
2    Grimbergen   0.25     4.00
3      Kriek      0.25     3.80
4     Heineken     0.5     6.80
5    Grimbergen    0.5     7.80
6      Kriek       0.5     7.50
7     Heineken      1      12.00
8    Grimbergen     1      14.00
9      Kriek        1      14.00
Range Facet

        ID             Marque                      Taille   Prix
        1              Heineken                    0.25     3.50
        2             Grimbergen                   0.25     4.00
      3
 Ranges       Count     Kriek
                         Min       Max     Moy     0.25
                                                   Total    3.80
   x<54         3        3.50
                       Heineken    4.00    3.77    11.30
                                                    0.5     6.80
5 <= x < 10
         5      3     Grimbergen 7.80
                         6.80              7.37    22.10
                                                    0.5     7.80
 10 <= x6       3       12.00
                        Kriek      14.00   13.33   40.00
                                                    0.5     7.50
        7              Heineken                      1      12.00
        8             Grimbergen                     1      14.00
        9               Kriek                        1      14.00
RangeFacet en Java
// Fabriquer une TermFacet (facet)
AbstractFacetBuilder facet = FacetBuilders.rangeFacet("byprice")
   .field("price")
   .addUnboundedFrom(5)
   .addRange(5, 10)
   .addUnboundedTo(10);

// Avec la recherche
SearchResponse sr = client.prepareSearch()
     .setQuery(qb)
     .addFacet(facet)
  .execute().actionGet();

// Facette en retour
RangeFacet byprice = sr.getFacets().facet("byprice");
for (RangeFacet.Entry entry : byprice) {
   entry.to();
   entry.from();
   entry.min();
   entry.max();
   entry.mean();
   entry.count();
}
Atelier 3


Regarder les sources du test 3
src/test/java/org/elasticsearchfr/handson/ex3/FacetTest.java



Instructions dans la javadoc et
https://github.com/elasticsearchfr/hands-on#test-3-analyzing-documents-with-facets
Mailing List ES France
  elasticsearch-fr@googlegroups.com
Mailing List ES France
                elasticsearch-fr@googlegroups.com
Slides sur http://fr.slideshare.net/dadoonet   Sources sur https://github.com/elasticsearchfr/hands-on

Contenu connexe

PDF
Nantes JUG - Elasticsearch
PPTX
ElasticSearch : Architecture et Développement
KEY
Elasticsearch - Montpellier JUG
KEY
Elasticsearch - Devoxx France 2012
PDF
Paris data geek - Elasticsearch
PDF
Normandy JUG - Elasticsearch
PDF
Finist JUG - Elasticsearch
PDF
Lausanne JUG - Elasticsearch
Nantes JUG - Elasticsearch
ElasticSearch : Architecture et Développement
Elasticsearch - Montpellier JUG
Elasticsearch - Devoxx France 2012
Paris data geek - Elasticsearch
Normandy JUG - Elasticsearch
Finist JUG - Elasticsearch
Lausanne JUG - Elasticsearch

Tendances (20)

PDF
Elasticsearch - Esme sudria
PDF
Poitou charentes JUG - Elasticsearch
PDF
Moteurs de recherche : un oeil sous le capot avec Elastic Search
PDF
Introduction à ElasticSearch
PDF
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
PPT
Solr and Elasticsearch in Action (at Breizhcamp)
PDF
Besoin de rien Envie de Search - Presentation Lucene Solr ElasticSearch
PPTX
A la recherche d'ElasticSearch
KEY
Lyon JUG - Elasticsearch
KEY
Elasticsearch - OSDC France 2012
PDF
Présentation de ElasticSearch / Digital apéro du 12/11/2014
PDF
Tirer le meilleur de ses données avec ElasticSearch
PDF
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
PDF
Oxalide Workshop #3 - Elasticearch, an overview
PPTX
Tunis big data_meetup__21_nov2015__aymenzaafouri
PDF
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
ODP
Solr retour d'experience
PPT
PDF
Tout ce que le getting started mongo db ne vous dira pas
PPTX
Solr, c'est simple et Big Data ready - prez au Lyon jug Fév 2014
Elasticsearch - Esme sudria
Poitou charentes JUG - Elasticsearch
Moteurs de recherche : un oeil sous le capot avec Elastic Search
Introduction à ElasticSearch
Migrer une application existante vers Elasticsearch - Nuxeo Tour 2014 - workshop
Solr and Elasticsearch in Action (at Breizhcamp)
Besoin de rien Envie de Search - Presentation Lucene Solr ElasticSearch
A la recherche d'ElasticSearch
Lyon JUG - Elasticsearch
Elasticsearch - OSDC France 2012
Présentation de ElasticSearch / Digital apéro du 12/11/2014
Tirer le meilleur de ses données avec ElasticSearch
Breizhcamp 2015 - Comment (ne pas réussir à) modéliser ses data dans elastics...
Oxalide Workshop #3 - Elasticearch, an overview
Tunis big data_meetup__21_nov2015__aymenzaafouri
[Breizhcamp 2015] MongoDB et Elastic, meilleurs ennemis ?
Solr retour d'experience
Tout ce que le getting started mongo db ne vous dira pas
Solr, c'est simple et Big Data ready - prez au Lyon jug Fév 2014
Publicité

En vedette (6)

PDF
Practical Elasticsearch - real world use cases
PPTX
Spark meetup v2.0.5
PPTX
Elasticsearch Distributed search & analytics on BigData made easy
PPTX
Apache HBase + Spark: Leveraging your Non-Relational Datastore in Batch and S...
DOC
ElasticSearch Hands On
PPTX
Apache Storm 0.9 basic training - Verisign
Practical Elasticsearch - real world use cases
Spark meetup v2.0.5
Elasticsearch Distributed search & analytics on BigData made easy
Apache HBase + Spark: Leveraging your Non-Relational Datastore in Batch and S...
ElasticSearch Hands On
Apache Storm 0.9 basic training - Verisign
Publicité

Similaire à Hands on lab Elasticsearch (20)

PDF
Grails from scratch to prod - MixIT 2011
PDF
Oxalide Academy : Workshop #3 Elastic Search
PDF
SSL 2011 : Présentation de 2 bases noSQL
PDF
Cours j query-id1575
PPTX
2014 04-09-fr - app dev series - session 4 - indexing
PDF
Microservices-DDD-Telosys-Devoxx-FR-2022
KEY
L'avenir de LAMP
PDF
Tout ce que le getting started MongoDB ne vous dira pas
PDF
Construisez votre première application MongoDB
PPTX
Elastic serach
KEY
La mobilité dans Drupal
KEY
Devoxx: Tribulation d'un développeur sur le Cloud
PDF
Introduction à Sinatra
PPTX
Atelier : Développement rapide d&rsquo;une application basée surXWiki
PPTX
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
PPTX
mix-it 2011
PDF
Spark - Ippevent 19-02-2015
PDF
Présentation de Django @ Orange Labs (FR)
ODP
Réu technodejs
PPTX
Jug algeria x wiki-atelier
Grails from scratch to prod - MixIT 2011
Oxalide Academy : Workshop #3 Elastic Search
SSL 2011 : Présentation de 2 bases noSQL
Cours j query-id1575
2014 04-09-fr - app dev series - session 4 - indexing
Microservices-DDD-Telosys-Devoxx-FR-2022
L'avenir de LAMP
Tout ce que le getting started MongoDB ne vous dira pas
Construisez votre première application MongoDB
Elastic serach
La mobilité dans Drupal
Devoxx: Tribulation d'un développeur sur le Cloud
Introduction à Sinatra
Atelier : Développement rapide d&rsquo;une application basée surXWiki
Nosql, hadoop, map reduce, hbase, sqoop, voldemort, cassandra -intro
mix-it 2011
Spark - Ippevent 19-02-2015
Présentation de Django @ Orange Labs (FR)
Réu technodejs
Jug algeria x wiki-atelier

Plus de David Pilato (9)

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

Dernier (7)

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

Hands on lab Elasticsearch

  • 1. Hands On Elasticsearch Malloum Laya / David Pilato
  • 2. Qui ? $ curl http://localhost:9200/talk/speaker/TheMalloum { "nom" : "Malloum Laya", "jobs" : [ { "boite" : "Logica", "mission" : "développeur", "duree" : 3 }, { "boite" : "DGDDI (douane)", "mission" : "chef de projets", "duree" : 4 } ], "passions" : [ "famille", "informatique", "rap français" ], "blog" : "http://malloum.fr/", "twitter" : [ "@TheMalloum", "@scrutmydocs" ], "email" : "malloum.laya@gmail.com" }
  • 3. Qui ? $ curl http://localhost:9200/talk/speaker/TheMalloum { "nom" : "Malloum Laya", "jobs" : [ { "boite" : "Logica", "mission" : "développeur", "duree" : 3 }, { "boite" : "DGDDI (douane)", "mission" : "chef de projets", "duree" : 4 } ], "passions" : [ "famille", "informatique", "rap français" ], "blog" : "http://malloum.fr/", "twitter" : [ "@TheMalloum", "@scrutmydocs" ], "email" : "malloum.laya@gmail.com" }
  • 4. Qui ? $ curl http://localhost:9200/talk/speaker/TheMalloum { "nom" : "Malloum Laya", "jobs" : [ { "boite" : "Logica", "mission" : "développeur", "duree" : 3 }, { "boite" : "DGDDI (douane)", "mission" : "chef de projets", "duree" : 4 } ], "passions" : [ "famille", "informatique", "rap français" ], "blog" : "http://malloum.fr/", "twitter" : [ "@TheMalloum", "@scrutmydocs" ], "email" : "malloum.laya@gmail.com" } $ 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" }
  • 6. Agenda Aperçu d'Elasticsearch Atelier 1 : indexons Atelier 2 : cherchons Atelier 3 : analysons
  • 8. Un moteur de recherche un moteur d’indexation de "documents" un moteur de recherche sur les index
  • 9. 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 avec distribution, réplication, fail over Très performant : distribution des calculs sur plusieurs nœuds C’est un moteur, pas une interface graphique !
  • 10. Penser document ! Changement de paradigme : On ne pense plus SQL ! On indexe ce qu'on veut trouver ! Un document, c'est : Un objet JSON Des propriétés simples (String, boolean, number) Des propriétés complexes (array, object) Des propriétés évoluées (geoloc, binary, attachments)
  • 11. Ranger ses documents { "text": "Bienvenue au Hands On Lab #elasticsearch pour #jduchess", "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": "jduchess", "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 !" } } Elasticsearch met à notre disposition Des types de document Des index Le document 1 de type Tweet dans l’index Twitter
  • 12. Agir 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 -d ‘{....}’ • 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 -d ‘{....}’ • curl -XPOST http://localhost:9200/twitter/_search -d ‘{....}’ • curl -XPOST http://localhost:9200/_search -d ‘{....}’ Meta données Elasticsearch • curl -XGET http://localhost:9200/twitter/_status • curl -XPOST http://localhost:9200/_shutdown
  • 13. Atelier 0 On prépare le terrain
  • 15. Quelques notions • Nœud (node) : Une instance d'Elasticsearch (~ machine ?)
  • 16. Quelques notions • Nœud (node) : Une instance d'Elasticsearch (~ machine ?) • Cluster : Un ensemble de nœuds
  • 17. Quelques notions • 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
  • 18. Quelques notions • 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
  • 19. Agir en Java // Création du noeud. Il s’agit d’une instance d’Elasticsearch complète ! Node node = NodeBuilder.nodeBuilder().node(); // Les opérations courantes (put, get, search, delete) // se font à l’aide d’un client ! Client client = node.client(); // On peut aussi faire des opérations d’administration // (état du cluster, suppression index, ...) ! AdminClient client = client.admin();
  • 20. Atelier 0 Récupérer la distribution Elasticsearch ES 0.19.9, elasticsearch.yml modifié, plugins : MOBZ Head, BigDesk, Paramedic curl -OL -k https://github.com/downloads/elasticsearchfr/hands-on/elasticsearch-0.19.9- handson.zip Cloner le repository git clone https://github.com/elasticsearchfr/hands-on.git Regarder les sources du test 0 src/test/java/org/elasticsearchfr/handson/ex0/NodeTest.java Instructions dans la javadoc et https://github.com/elasticsearchfr/hands-on#test-0-just-start-a-node
  • 21. Atelier 1 On indexe des bières ;-)
  • 22. Indexer en Java // On peut fabriquer du json à la main String json = "{ "field":"value" }"; // En utilisant le XContent d’Elasticsearch XContentBuilder xcb = XContentFactory.jsonBuilder() .startObject() .field("field", "value") .endObject(); String json = xcb.toString(); // Sérialiser JavaBean en JSon // On peut utiliser Jackson : http://wiki.fasterxml.com/JacksonHome Beer beer = new Beer("Heineken", Colour.PALE, 0.33, 3); ObjectMapper mapper = new ObjectMapper(); String json = mapper.writeValueAsString(beer); // On peut indexer ! client.prepareIndex("index", "type").setSource(json).execute().actionGet(); client.prepareIndex("index", "type", "id").setSource(xcb).execute().actionGet(); // Insérer en mode Bulk BulkRequestBuilder brb = client.prepareBulk(); // Ajouter des actions à réaliser brb.add(new IndexRequest("index", "type").source(json)); // Exécuter le bulk brb.execute().actionGet();
  • 23. Récupérer en Java // Récupérer GetResponse gr = client.prepareGet("index", "type", "id").execute().actionGet(); // Désérialiser de JSon vers JavaBean ObjectMapper mapper = new ObjectMapper(); Beer beer = mapper.readValue(gr.getSourceAsBytes(), Beer.class);
  • 24. Effacer en Java // Effacer client.prepareDelete("index", "type", "id").execute().actionGet(); // Effacer en mode Bulk BulkRequestBuilder brb = client.prepareBulk(); // Ajouter des actions à réaliser brb.add(new DeleteRequest("index", "type", "id")); // Exécuter le bulk brb.execute().actionGet();
  • 25. Atelier 1 Regarder les sources du test 1 src/test/java/org/elasticsearchfr/handson/ex1/IndexTest.java Instructions dans la javadoc et https://github.com/elasticsearchfr/hands-on#test-1-indexget-and-delete-some-documents
  • 26. Atelier 2 On cherche des bières ;-)
  • 27. Query DSL Type Description Match All Recherche tout le contenu QueryString Recherche « à la google » : syntaxe Lucene possible +, -, FROM, TO, ^ Bool Recherche multi-critères (MUST, MUST NOT, SHOULD) Term Recherche d'un terme précis dans un champ donné Match Recherche « à la google » dans le contenu d’un champ Range Recherche par intervalle (>, >=, <, <=) dans un champ
  • 28. Chercher en Java // Fabriquer un QueryBuilder (qb) // MatchAll QueryBuilder qb = QueryBuilders.matchAllQuery(); // TermQuery QueryBuilder qb = QueryBuilders.termQuery("field", "value"); // MatchQuery QueryBuilder qb = QueryBuilders.matchQuery("field", "you can enter a text here"); // QueryString QueryBuilder qb = QueryBuilders.queryString("you can enter a text here"); // RangeQuery QueryBuilder qb = QueryBuilders.rangeQuery("field").from(5).to(10); // BoolQuery QueryBuilder qb = QueryBuilders.boolQuery() .must(QueryBuilders.termQuery("field1", "value")) .mustNot(QueryBuilders.termQuery("field2", "value")) .should(QueryBuilders.rangeQuery("field3").from(0).to(5));
  • 29. Les résultats // Lancer une recherche SearchResponse sr = client.prepareSearch().setQuery(qb).execute().actionGet(); // Récupérer le temps d’exécution long execTime = sr.getTookInMillis(); // Récupérer le nombre de hits long nbHits = sr.getHits().getTotalHits(); // Récupérer les hits SearchHit[] hits = sr.getHits().getHits(); SearchHit hit = hits[0]; // Récupérer les coordonnées du document hit.getIndex(); hit.getType(); hit.getId(); // Récupérer la pertinence du document hit.getScore(); // Récupérer le document source au format Json hit.getSourceAsString();
  • 30. Atelier 2 Regarder les sources du test 2 src/test/java/org/elasticsearchfr/handson/ex2/SearchTest.java Instructions dans la javadoc et https://github.com/elasticsearchfr/hands-on#test-2-searching-for-documents
  • 31. Atelier 3 La bière vue sous un autre angle Les facettes
  • 32. Les facettes ID Marque Taille Prix 1 Heineken 0.25 3.50 2 Grimbergen 0.25 4.00 3 Kriek 0.25 3.80 4 Heineken 0.5 6.80 5 Grimbergen 0.5 7.80 6 Kriek 0.5 7.50 7 Heineken 1 12.00 8 Grimbergen 1 14.00 9 Kriek 1 14.00
  • 33. Term Facet ID Marque Taille Prix 1 Heineken 0.25 3.50 2 Grimbergen 0.25 4.00 3 Kriek 0.25 3.80 4 Heineken 0.5 6.80 5 Grimbergen 0.5 7.80 6 Kriek 0.5 7.50 7 Heineken 1 12.00 8 Grimbergen 1 14.00 9 Kriek 1 14.00
  • 34. Term Facet ID Marque Taille Prix 1 Heineken 0.25 3.50 2 Grimbergen 0.25 4.00 3 Kriek 0.25 Marque Count3.80 4 Heineken 0.5 Heineken 3 6.80 5 Grimbergen 0.5Grimbergen 3 7.80 6 Kriek 0.5 Kriek 3 7.50 7 Heineken 1 12.00 8 Grimbergen 1 14.00 9 Kriek 1 14.00
  • 35. TermFacet en Java // Fabriquer une TermFacet (facet) AbstractFacetBuilder facet = FacetBuilders.termsFacet("bybrand").field("marque"); // Avec la recherche SearchResponse sr = client.prepareSearch() .setQuery(qb) .addFacet(facet) .execute().actionGet(); // Facette en retour TermsFacet bybrand = sr.getFacets().facet("bybrand"); for (TermsFacet.Entry entry : bybrand) { String marque = entry.getTerm(); int nb = entry.count(); }
  • 36. Range Facet ID Marque Taille Prix 1 Heineken 0.25 3.50 2 Grimbergen 0.25 4.00 3 Kriek 0.25 3.80 4 Heineken 0.5 6.80 5 Grimbergen 0.5 7.80 6 Kriek 0.5 7.50 7 Heineken 1 12.00 8 Grimbergen 1 14.00 9 Kriek 1 14.00
  • 37. Range Facet ID Marque Taille Prix 1 Heineken 0.25 3.50 2 Grimbergen 0.25 4.00 3 Ranges Count Kriek Min Max Moy 0.25 Total 3.80 x<54 3 3.50 Heineken 4.00 3.77 11.30 0.5 6.80 5 <= x < 10 5 3 Grimbergen 7.80 6.80 7.37 22.10 0.5 7.80 10 <= x6 3 12.00 Kriek 14.00 13.33 40.00 0.5 7.50 7 Heineken 1 12.00 8 Grimbergen 1 14.00 9 Kriek 1 14.00
  • 38. RangeFacet en Java // Fabriquer une TermFacet (facet) AbstractFacetBuilder facet = FacetBuilders.rangeFacet("byprice") .field("price") .addUnboundedFrom(5) .addRange(5, 10) .addUnboundedTo(10); // Avec la recherche SearchResponse sr = client.prepareSearch() .setQuery(qb) .addFacet(facet) .execute().actionGet(); // Facette en retour RangeFacet byprice = sr.getFacets().facet("byprice"); for (RangeFacet.Entry entry : byprice) { entry.to(); entry.from(); entry.min(); entry.max(); entry.mean(); entry.count(); }
  • 39. Atelier 3 Regarder les sources du test 3 src/test/java/org/elasticsearchfr/handson/ex3/FacetTest.java Instructions dans la javadoc et https://github.com/elasticsearchfr/hands-on#test-3-analyzing-documents-with-facets
  • 40. Mailing List ES France elasticsearch-fr@googlegroups.com
  • 41. Mailing List ES France elasticsearch-fr@googlegroups.com Slides sur http://fr.slideshare.net/dadoonet Sources sur https://github.com/elasticsearchfr/hands-on

Notes de l'éditeur