SlideShare uma empresa Scribd logo
1 de 40
ELASTICSEARCH
Mohamed Hedi Abidi @mh_abidi
David AZRIA @David_AZR
INTRODUCTION
ElasticSearch est un moteur de recherche Open Source
(Apache 2). Il utilise la librairie Apache Lucene et indexe
les données sous forme de documents. Sa mise en place
est facile et rapide.
Il possède des avantages indéniables dont :
 recherche en quasi temps réel
 scalable, Haute disponibilité
 automatiquement sauvegardé et répliqué
 API REST
La dernière version en date est la 1.0.1.
http://www.elasticsearch.org/overview/elkdownloads/
LES BASES (1)
La distribution contient :
 bin : script de lancement elasticsearch.bat (windows) et
elasticsearch (linux)
 config : contient les fichiers elasticsearch.yml et
logging.yml
 data : répertoire par défaut des données indexées
 lib : contient les librairies
 logs : fichiers logs
LES BASES (2)
Démarrage d’ElasticSearch :
Variables d’environnements:
 EZ_HEAP_SIZE : JMV Heap Size
 EZ_JAVA_OPTS : options de la JVM
$./bin/elasticsearch
# mode daemon
$./bin/elasticsearch -d
LES BASES (3)
Configuration:
config/elasticsearch.yml
cluster.name: mycluster
http.port: 9200
transport.port: 9300
network.host: localhost
discovery.zen.ping.multicast.enabled: false
discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]
LES BASES (4)
Fonctionnement cluster:
 Nœud : Correspond à une instance ElasticSearch
 Cluster : Il est composé d’un à plusieurs Node. Un nœud maître est choisi, il sera
remplacé en cas de défaillance. Par défaut, un nœud utilisera le multicast pour
trouver un cluster du même nom. Mais il est préférable d’utiliser l’unicast dans
des réseaux sécurisés.
 Index : Espace logique de stockage de documents de même type, découpé sur
un à plusieurs Primary Shards et peut être répliqué sur zéro ou plusieurs
Secondary Shards.
 Shard : Correspond à une instance Lucène.
 Primary Shard : Par défaut, l’index est découpé en 5 Shards Primary. Il n’est pas
possible de changer le nombre de Shards après sa création.
 Secondary Shard : Il s’agit des Shards répliqués. Il peut en avoir zéro à plusieurs
par Primary Shard.
 Routage : Permet de sélectionner un Primary Shard pour indexer le document. Il
est choisi en hachant la valeur de l’ID du document ou de l’ID du document
parent pour s’assurer que les documents parents et enfants soient stockés sur le
même Primary Shard.
LES BASES (4)
b2 b1
Node 1 (Master)
a0 a1 b0
Node 2
b1 a1
Node 4
b0
b2
a0
Node 3
Réplication
Cluster
Shard primaire Shard répliqué
Instance ElasticSearch Instance ElasticSearch
Instance ElasticSearch Instance ElasticSearch
b3
b3b4 b4
a et b = index
Document à indexer
Route
API REST (1)
EllasticSearch offre une API REST permettant d’effectuer tous
types d’opération. Il supporte les méthodes HTTP (GET, PUT,
POST et DELETE).
 Index : Nom de l’index
 Type : Nom du type du document
 Id : ID du document
 Action : Action à effectuer
curl -XPUT 'http://localhost:9200/[index]/[type]/[id]/[action]'
API REST (2) : INDEXATION DE DOCUMENT
Ajout ou modification d’un document :
Avec création de l’ID automatiquement :
curl -XPUT 'http://localhost:9200/biblio/livres/1' -d '{
"titre": "Shining",
"auteur": "Stephen King",
"genre": "Fantastique",
"date_parution": "27/01/1977"
}'
curl -XPOST 'http://localhost:9200/biblio/livres' -d '{
"titre": "Shining",
"auteur": "Stephen King",
"genre": "Fantastique",
"date_parution": "27/01/1977"
}'
API REST (3) : INDEXATION DE DOCUMENT
Réponse :
HTTP 200 : Document modifié
HTTP 201 : Document créé
HTTP 409 : Document existe déjà dans le cas d’une opération de
création 'http://localhost:9200/biblio/livres/1/_create'
{
"ok": "true",
"_index": "biblio",
"_type": "livres",
"_id": "1",
"_version": "1"
}
API REST (4) : TYPES DE DONNÉES
 string, integer, long, float, double, boolean, datetime, binary
(base64)
 Array, Object
 geo_point, geo_shape, ip
API REST (4) : MÉTA DATA D’UN DOCUMENT
Champ Activé par défaut Description
_id Id du document
_type Type du document
_source Oui Document original qui a été indexé
_all Oui Indexes de toutes les valeurs des champs
du document
_timestamp Non Timestamp du document
_ttl Non Temps d’expiration du document
_size Non Taille du document original (_source)
API REST (5) : GET
Réponse :
HTTP 200 : OK
HTTP 404 : NOT FOUND
{
"_index": "biblio",
"_type": "livres",
"_id": "1",
"_version": 1,
"found" : true,
"_source" : {
"titre": "Shining",
"auteur": "Stephen King",
"genre": "Fantastique",
"date_parution": "28/01/1977"
}
}
curl -XGET 'http://localhost:9200/biblio/livres/1'
API REST (6) : UPDATE
Si le document existe, il est fusionné,
curl -XPOST 'http://localhost:9200/biblio/livres/1/_update ' -d ' {
"doc" : {
"date_parution": "28/01/1977"
}
API REST (7) : VERSION
Un numéro de version est assigné à la création d’un document. Ce
numéro de version est incrémenté pour chaque opération de
réindexassions, modifications ou de suppressions. Une opération de
modification est validé si le numéro de version de la requête
correspond au numéro de version indexé.
API REST (8) : SEARCH
Requête :
curl -XGET 'http://localhost:9200/biblio/_search?q=Shining'
curl -XPOST 'http://localhost:9200/index1/type1/_search' –d { }
curl -XPOST 'http://localhost:9200/index1/type1,type2/_search' –d { }
curl -XPOST 'http://localhost:9200/index1,index2/type1/_search' –d { }
curl -XPOST 'http://localhost:9200/_all/type1/_search' –d { }
API REST (8) : SEARCH
Réponse :
{ "took":8,
"timed_out":false,
"_shards": {
"total":5,
"successful":5,
"failed":0
},
"hits": {
"total":1,
"max_score":0.09289607,
"hits":[
{
"_index":“ebiznext",
"_type":"formation",
"_id":"3",
"_score":0.09289607,
"_source" : {
"titre": "Shining",
"auteur": "Stephen King",
"genre": "Fantastique",
"date_parution": "28/01/1977"
}}]}}
ANALYSE DE TEXTE (1)
Les deux requêtes ci-dessous ne retourne aucun document.
curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{
"user": "david",
"message": "C'est mon premier message de la journée !",
"postDate": "2014-04-03T15:23:56",
"priority": 2 ,
"rank": 10.2
}'
curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=est&pretty=true'
curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=journée&pretty=true'
ANALYSE DE TEXTE (2)
curl -XGET "http://localhost:9200/twitter/_mapping?pretty=true"
{
"twitter" : {
"mappings" : {
"tweet" : {
"properties" : {
"message" : { "type" : "string" },
"postDate" : { "type" : "date", "format" : "dateOptionalTime“},
"priority" : {"type" : "long"},
"rank" : {"type" : "double“ },
"user" : {"type" : "string"}
}}}}}
Comme on peut le voir ci-dessous, ElasticSearch type
automatiquement les champs. Mais le document n’a pas été
trouvé lorsque l’on effectue une recherche car il utilise
l’Analyseur standard qui ne colle pas à notre besoin.
ANALYSE DE TEXTE (3)
curl -XGET ‘http://localhost:9200/twitter/_analyze?pretty=true’ -d "C'est"
{
"tokens" : [ {
"token" : "c'est",
"start_offset" : 0,
"end_offset" : 5,
"type" : "<ALPHANUM>",
"position" : 1
} ]
}
curl -XGET "http://localhost:9200/twitter/_analyze?pretty=true" -d "journée"
{
"tokens" : [ {
"token" : "journée",
"start_offset" : 0,
"end_offset" : 5,
"type" : "<ALPHANUM>",
"position" : 1
} ]
}
ANALYSE DE TEXTE (4)
curl -XGET
"http://localhost:9200/twitter/_analyze?tokenizer=letter&filters=asciifolding,lowercase&pretty=true" -d
"c'est"
{
"tokens" : [
{ "token" : "c", "start_offset" : 0, "end_offset" : 1, "type" : "word", "position" : 1 },
{ "token" : "est", "start_offset" : 2, "end_offset" : 5, "type" : "word","position" : 2 }
]
}
curl -XGET
"http://localhost:9200/twitter/_analyze?tokenizer=letter&filters=asciifolding,lowercase&pretty=true" -d
"journée"
{
"tokens" : [ {
"token" : "journee",
"start_offset" : 1,
"end_offset" : 8,
"type" : "word",
"position" : 1
} ]
}
ANALYSE DE TEXTE (5)
Configuration global :
curl -XPUT 'http://localhost:9200/twitter' -d '{
"settings" : {
"analyzer" : {
"myAnalyzer" : {
"tokenizer" : "letter",
"filter" : ["asciifolding", "lowercase", "mySynonyms"]
}
"filter" : {
"mySynonyms" : {
"type" : "synonym",
"synonyms" : ["premier, initial"]
}
}
}
}
}'
ANALYSE DE TEXTE : TOKENIZER ET FILTER
Un Analyser est composé d’un Tokenizer et de zéro à plusieurs Filters,
 Tokenizer : Il permet de scinder un texte en plusieurs éléments.
(standard, keyword, whitespace, pattern, letter, custom, etc.)
 Filter : Les filtres peuvent modifier ou supprimer Tokens.
(lowercase, synonym , asciifolding, nGrams, custom, etc.)
MAPPINGS
 Elasticsearch est ‘sans schéma’
 Configurer seulement au besoin
 Mapping dynamique créé pour les types non configurés
 Mapping dynamique : appliquer les mappings par défaut
pour les informations extraites du document JSON.
 Mapping = Définir comment les documents sont
analysés et indexés:
 Les types des les champs/objets du document.
 Les relations entre les documents.
 La gestion des méta-données du document.
 La définition de la pertinence par champ/document
(boosting)
MAPPINGS : POURQUOI?
 Adapter l’analyse de données à un domaine métier
spécifique
 Adapter la recherche aux utilisateurs :
 terminologies spécifiques, multi-langages.
 Certaines fonctionnalités l’exigent
 Tri,
 Agrégation
 Hilighting
MAPPINGS API
 Création de mappings lors de la création d’index :
 Récupération du mapping :
curl -XPOST localhost:9200/crunchbase -d '{
"settings" : {
"number_of_shards" : 1
},
"mappings" : {
"company" : {
"_source" : { "enabled" : false },
"properties" : {
"name" : { "type" : "string", "analyzer" : "standard" }
}
}
}
}'
Curl –XGET ‘localhost:9200/crunchbase/_mapping/company’
MAPPINGS : TYPES
Type Attribut Description
String
Index
analyzed : indexé, analysé.
not_analyzed : indexé mais pas analysé.
no : non indexé.
Analyzer
définit l’analyseur qui sera utilisé lors de
l’indexation ou de la recherche.
Nombres
ignore_malformed
ignorer un nombre mal formaté. valeur par
défaut : false
Coerce
convertit les strings en nombres. valeur par
défaut : false
Date
Format format attendu. exemple : yyy/MM/dd
ignore_malformed ignorer les valeurs mal formatées
{
"tweet" : {
"properties" : {
"name" : {
"type" : "multi_field",
"fields" : {
"name":{"type":"string","index":"analyzed"},
"untouched":{"type":"string","index":"not_analyzed"}
}
}
}
}
}
MULTI-FIELDS
 Le multi-field permet d’indexer un champ du document
sous plusieurs formes
 cas d’utilisation : utiliser plusieurs analyseurs pour le même
champ
RELATIONS (1) : LES TYPES ‘NESTED’ VS PARENT/FILS
 Nested : Les objets de la relations sont stockés dans le
même document
 Parent/fils : le pères et ses fils sont stockés dans des
documents séparés
{
"employee" : {
"_parent" : { "type" : "blog " }
}
}
{
"company" : {
"properties" : {
"product" : {
"type" : "nested",
"properties": {
"name" : {"type": "string", "index": "not_analyzed"},
"count" : {"type": "integer"}
}
}
}
}
}
RELATIONS (2) : LES TYPES ‘NESTED’ VS PARENT/FILS
 Les types ‘nested’
 Lecture rapide : les documents sont stockés dans le même
block Lucene.
 Mise à jour est couteuse : ES réindexe tout le document si le
document ‘nested’ est mis à jour
 Moins flexible : mieux adapté pour les données qui ne
changent pas souvent
 Parent/fils
 Moins performant : Père et fils sont stockés dans des
documents séparés (mais dans le même shard)
 Plus de mémoire : Les IDs sont chargés en mémoire.
 Flexible : Parent et fils sont modifiés séparément, pas de re-
indexation
RECHERCHE : QUERY DSL
 Le query DSL (Domain Specific Language) permet
d’exprimer des définitions complexes de requêtes.
 Il existes deux types de query DSL :
 Requêtes :
 Utilisé pour la recherche full text
 Le résultat dépend d’un score attribué aux documents
 Pas d’utilisation de cache
 Filtres :
 Pas de manipulation de scores.
 Utilisation de cache.
RECHERCHE : EXEMPLES
Requêtes Filtres
Boosting Query
Constant Score Query
And Filter
Bool Filter
Not Filter
Or Filter
Match Query
Multi Match Query
Term Filter
Terms Filter
Match All Query GeoShape Filter
Has Child Query
Has Parent Query
Nested Query
Has Child Filter
Has Parent Filter
Nested Filter
Regexp Filter
Script Filter
HIGHLIGHT DES RÉSULTAT DE LA RECHERCHE
 Highlight : montrer des extraits du texte correspondant
au résultat de la requête
"query" : {
"match" : {
"title" : "branches"
}
},
"highlight" : {
"fields" : {
"content" : {}
}
}
SUGGESTION
 Suggestion : suggérer des termes similaires à la
recherche.
PERCOLATOR
 Le percolateur permet de savoir quelle requête
correspond à un document donné
 Fonctionnement inversé de la recherche
 Cas d’utilisation :
 Alertes et monitoring
 Enregistrement d’une requête
curl -XPUT 'localhost:9200/my-index/.percolator/1' -d '{
"query" : {
"match" : {
"message" : "bonsai tree"
}
}
}’
PERCOLATOR
 Commande permettant de savoir quelle requête
correspond au document donné
 Réponse : l’id de la requête qui ‘matche’ le document
curl -XGET 'localhost:9200/my-index/message/_percolate' -d '{
"doc" : {
"message" : "A new bonsai tree in the office"
}
}'
{"took" : 19,
"_shards" : {
…
},
"total" : 1,
"matches" : [{
"_index" : "my-index",
"_id" : "1"
}]}
PLUGINS
 ElasticSearch dispose de son propre système de plugins
qui permet d’enrichir les fonctionnalités de base.
Plusieurs plugins sont développés par Elasticsearch ou
par la communauté. On distingue :
 Les analyseurs : Ensemble de filtres et séparateurs pour
supporter les langues.
 Les rivières : Les rivers (rivières) ont pour rôle d’injecter les
données provenant de divers sources de données dans
ElasticSearch. Il existe 4 rivières standards : CouchDB,
RabbitMQ, Twitter et Wikipedia.
 Il y a également plusieurs autres rivières développées par la
communauté qui permettent d’injecter les données
provenant de MongoDB, Neo4J, flux RSS, Git…
 Support des scripts : Clojure, Groovy, Javascript…
Q&R

Mais conteúdo relacionado

Mais procurados

Alphorm.com Formation Elastic : Maitriser les fondamentaux
Alphorm.com Formation Elastic : Maitriser les fondamentauxAlphorm.com Formation Elastic : Maitriser les fondamentaux
Alphorm.com Formation Elastic : Maitriser les fondamentauxAlphorm
 
Angular Framework présentation PPT LIGHT
Angular Framework présentation PPT LIGHTAngular Framework présentation PPT LIGHT
Angular Framework présentation PPT LIGHTtayebbousfiha1
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootDNG Consulting
 
Thrift vs Protocol Buffers vs Avro - Biased Comparison
Thrift vs Protocol Buffers vs Avro - Biased ComparisonThrift vs Protocol Buffers vs Avro - Biased Comparison
Thrift vs Protocol Buffers vs Avro - Biased ComparisonIgor Anishchenko
 
Redis cluster
Redis clusterRedis cluster
Redis clusteriammutex
 
Découverte de Elastic search
Découverte de Elastic searchDécouverte de Elastic search
Découverte de Elastic searchJEMLI Fathi
 
Py.test
Py.testPy.test
Py.testsoasme
 
Automation with ansible
Automation with ansibleAutomation with ansible
Automation with ansibleKhizer Naeem
 
Introduction to node.js
Introduction to node.jsIntroduction to node.js
Introduction to node.jsjacekbecela
 
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 SeoulElastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 SeoulSeungYong Oh
 
Centralized log-management-with-elastic-stack
Centralized log-management-with-elastic-stackCentralized log-management-with-elastic-stack
Centralized log-management-with-elastic-stackRich Lee
 
Introduction to ansible
Introduction to ansibleIntroduction to ansible
Introduction to ansibleOmid Vahdaty
 

Mais procurados (20)

Alphorm.com Formation Elastic : Maitriser les fondamentaux
Alphorm.com Formation Elastic : Maitriser les fondamentauxAlphorm.com Formation Elastic : Maitriser les fondamentaux
Alphorm.com Formation Elastic : Maitriser les fondamentaux
 
Elasticsearch
ElasticsearchElasticsearch
Elasticsearch
 
Angular Framework présentation PPT LIGHT
Angular Framework présentation PPT LIGHTAngular Framework présentation PPT LIGHT
Angular Framework présentation PPT LIGHT
 
Concevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring BootConcevoir, développer et sécuriser des micro-services avec Spring Boot
Concevoir, développer et sécuriser des micro-services avec Spring Boot
 
Gradle Introduction
Gradle IntroductionGradle Introduction
Gradle Introduction
 
Thrift vs Protocol Buffers vs Avro - Biased Comparison
Thrift vs Protocol Buffers vs Avro - Biased ComparisonThrift vs Protocol Buffers vs Avro - Biased Comparison
Thrift vs Protocol Buffers vs Avro - Biased Comparison
 
Redis cluster
Redis clusterRedis cluster
Redis cluster
 
Découverte de Elastic search
Découverte de Elastic searchDécouverte de Elastic search
Découverte de Elastic search
 
Py.test
Py.testPy.test
Py.test
 
Elasticsearch
ElasticsearchElasticsearch
Elasticsearch
 
Automation with ansible
Automation with ansibleAutomation with ansible
Automation with ansible
 
Introduction to node.js
Introduction to node.jsIntroduction to node.js
Introduction to node.js
 
Struts
StrutsStruts
Struts
 
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 SeoulElastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
Elastic Stack 을 이용한 게임 서비스 통합 로깅 플랫폼 - elastic{on} 2019 Seoul
 
Centralized log-management-with-elastic-stack
Centralized log-management-with-elastic-stackCentralized log-management-with-elastic-stack
Centralized log-management-with-elastic-stack
 
Introduction to ansible
Introduction to ansibleIntroduction to ansible
Introduction to ansible
 
Nouveautés de java 8
Nouveautés de java 8Nouveautés de java 8
Nouveautés de java 8
 
Support JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVCSupport JEE Spring Inversion de Controle IOC et Spring MVC
Support JEE Spring Inversion de Controle IOC et Spring MVC
 
Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)Sécurité des Applications Web avec Json Web Token (JWT)
Sécurité des Applications Web avec Json Web Token (JWT)
 
introduction à MongoDB
introduction à MongoDBintroduction à MongoDB
introduction à MongoDB
 

Semelhante a ElasticSearch : Architecture et Développement

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é
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab ElasticsearchDavid Pilato
 
Lyon JUG - Elasticsearch
Lyon JUG - ElasticsearchLyon JUG - Elasticsearch
Lyon JUG - ElasticsearchDavid Pilato
 
code4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABEScode4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABESABES
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewLudovic Piot
 
Oxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide
 
Presentation Lucene / Solr / Datafari - Nantes JUG
Presentation Lucene / Solr / Datafari - Nantes JUGPresentation Lucene / Solr / Datafari - Nantes JUG
Presentation Lucene / Solr / Datafari - Nantes JUGfrancelabs
 
Valtech - NoSQL, solution alternative ou complémentaire aux bases de données ...
Valtech - NoSQL, solution alternative ou complémentaire aux bases de données ...Valtech - NoSQL, solution alternative ou complémentaire aux bases de données ...
Valtech - NoSQL, solution alternative ou complémentaire aux bases de données ...Valtech
 
Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012David Pilato
 
Azure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmediaAzure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmediaMicrosoft
 
Benchmarking NoSQL DataBase dans le cadre d'un projet IoT
Benchmarking NoSQL DataBase dans le cadre d'un projet IoTBenchmarking NoSQL DataBase dans le cadre d'un projet IoT
Benchmarking NoSQL DataBase dans le cadre d'un projet IoTCHAKER ALLAOUI
 
Affichage d'un document Office sous Android
Affichage d'un document Office sous AndroidAffichage d'un document Office sous Android
Affichage d'un document Office sous AndroidStéphane Liétard
 
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big DataJournées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big DataDavid Joubert
 
Elasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUGElasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUGDavid Pilato
 
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
 

Semelhante a ElasticSearch : Architecture et Développement (20)

Elastic serach
Elastic serachElastic serach
Elastic serach
 
Adopte une BDD
Adopte une BDDAdopte une BDD
Adopte une BDD
 
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
 
Hands on lab Elasticsearch
Hands on lab ElasticsearchHands on lab Elasticsearch
Hands on lab Elasticsearch
 
Lyon JUG - Elasticsearch
Lyon JUG - ElasticsearchLyon JUG - Elasticsearch
Lyon JUG - Elasticsearch
 
code4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABEScode4lib 2011 : choses vues et entendues par l'ABES
code4lib 2011 : choses vues et entendues par l'ABES
 
Oxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overviewOxalide Workshop #3 - Elasticearch, an overview
Oxalide Workshop #3 - Elasticearch, an overview
 
Oxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic SearchOxalide Academy : Workshop #3 Elastic Search
Oxalide Academy : Workshop #3 Elastic Search
 
Presentation Lucene / Solr / Datafari - Nantes JUG
Presentation Lucene / Solr / Datafari - Nantes JUGPresentation Lucene / Solr / Datafari - Nantes JUG
Presentation Lucene / Solr / Datafari - Nantes JUG
 
Valtech - NoSQL, solution alternative ou complémentaire aux bases de données ...
Valtech - NoSQL, solution alternative ou complémentaire aux bases de données ...Valtech - NoSQL, solution alternative ou complémentaire aux bases de données ...
Valtech - NoSQL, solution alternative ou complémentaire aux bases de données ...
 
Show de boucane pour ELK
Show de boucane pour ELKShow de boucane pour ELK
Show de boucane pour ELK
 
PHP #6 : mysql
PHP #6 : mysqlPHP #6 : mysql
PHP #6 : mysql
 
Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012Elasticsearch - OSDC France 2012
Elasticsearch - OSDC France 2012
 
Azure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmediaAzure Camp 9 Décembre - slides session développeurs webmedia
Azure Camp 9 Décembre - slides session développeurs webmedia
 
Benchmarking NoSQL DataBase dans le cadre d'un projet IoT
Benchmarking NoSQL DataBase dans le cadre d'un projet IoTBenchmarking NoSQL DataBase dans le cadre d'un projet IoT
Benchmarking NoSQL DataBase dans le cadre d'un projet IoT
 
Affichage d'un document Office sous Android
Affichage d'un document Office sous AndroidAffichage d'un document Office sous Android
Affichage d'un document Office sous Android
 
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big DataJournées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
Journées SQL 2014 - Hive ou la convergence entre datawarehouse et Big Data
 
Elasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUGElasticsearch - Montpellier JUG
Elasticsearch - Montpellier JUG
 
L'avenir de LAMP
L'avenir de LAMPL'avenir de LAMP
L'avenir de LAMP
 
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
 

ElasticSearch : Architecture et Développement

  • 1. ELASTICSEARCH Mohamed Hedi Abidi @mh_abidi David AZRIA @David_AZR
  • 2. INTRODUCTION ElasticSearch est un moteur de recherche Open Source (Apache 2). Il utilise la librairie Apache Lucene et indexe les données sous forme de documents. Sa mise en place est facile et rapide. Il possède des avantages indéniables dont :  recherche en quasi temps réel  scalable, Haute disponibilité  automatiquement sauvegardé et répliqué  API REST La dernière version en date est la 1.0.1. http://www.elasticsearch.org/overview/elkdownloads/
  • 3. LES BASES (1) La distribution contient :  bin : script de lancement elasticsearch.bat (windows) et elasticsearch (linux)  config : contient les fichiers elasticsearch.yml et logging.yml  data : répertoire par défaut des données indexées  lib : contient les librairies  logs : fichiers logs
  • 4. LES BASES (2) Démarrage d’ElasticSearch : Variables d’environnements:  EZ_HEAP_SIZE : JMV Heap Size  EZ_JAVA_OPTS : options de la JVM $./bin/elasticsearch # mode daemon $./bin/elasticsearch -d
  • 5. LES BASES (3) Configuration: config/elasticsearch.yml cluster.name: mycluster http.port: 9200 transport.port: 9300 network.host: localhost discovery.zen.ping.multicast.enabled: false discovery.zen.ping.unicast.hosts: ["host1", "host2:port"]
  • 6. LES BASES (4) Fonctionnement cluster:  Nœud : Correspond à une instance ElasticSearch  Cluster : Il est composé d’un à plusieurs Node. Un nœud maître est choisi, il sera remplacé en cas de défaillance. Par défaut, un nœud utilisera le multicast pour trouver un cluster du même nom. Mais il est préférable d’utiliser l’unicast dans des réseaux sécurisés.  Index : Espace logique de stockage de documents de même type, découpé sur un à plusieurs Primary Shards et peut être répliqué sur zéro ou plusieurs Secondary Shards.  Shard : Correspond à une instance Lucène.  Primary Shard : Par défaut, l’index est découpé en 5 Shards Primary. Il n’est pas possible de changer le nombre de Shards après sa création.  Secondary Shard : Il s’agit des Shards répliqués. Il peut en avoir zéro à plusieurs par Primary Shard.  Routage : Permet de sélectionner un Primary Shard pour indexer le document. Il est choisi en hachant la valeur de l’ID du document ou de l’ID du document parent pour s’assurer que les documents parents et enfants soient stockés sur le même Primary Shard.
  • 7. LES BASES (4) b2 b1 Node 1 (Master) a0 a1 b0 Node 2 b1 a1 Node 4 b0 b2 a0 Node 3 Réplication Cluster Shard primaire Shard répliqué Instance ElasticSearch Instance ElasticSearch Instance ElasticSearch Instance ElasticSearch b3 b3b4 b4 a et b = index Document à indexer Route
  • 8. API REST (1) EllasticSearch offre une API REST permettant d’effectuer tous types d’opération. Il supporte les méthodes HTTP (GET, PUT, POST et DELETE).  Index : Nom de l’index  Type : Nom du type du document  Id : ID du document  Action : Action à effectuer curl -XPUT 'http://localhost:9200/[index]/[type]/[id]/[action]'
  • 9. API REST (2) : INDEXATION DE DOCUMENT Ajout ou modification d’un document : Avec création de l’ID automatiquement : curl -XPUT 'http://localhost:9200/biblio/livres/1' -d '{ "titre": "Shining", "auteur": "Stephen King", "genre": "Fantastique", "date_parution": "27/01/1977" }' curl -XPOST 'http://localhost:9200/biblio/livres' -d '{ "titre": "Shining", "auteur": "Stephen King", "genre": "Fantastique", "date_parution": "27/01/1977" }'
  • 10. API REST (3) : INDEXATION DE DOCUMENT Réponse : HTTP 200 : Document modifié HTTP 201 : Document créé HTTP 409 : Document existe déjà dans le cas d’une opération de création 'http://localhost:9200/biblio/livres/1/_create' { "ok": "true", "_index": "biblio", "_type": "livres", "_id": "1", "_version": "1" }
  • 11. API REST (4) : TYPES DE DONNÉES  string, integer, long, float, double, boolean, datetime, binary (base64)  Array, Object  geo_point, geo_shape, ip
  • 12. API REST (4) : MÉTA DATA D’UN DOCUMENT Champ Activé par défaut Description _id Id du document _type Type du document _source Oui Document original qui a été indexé _all Oui Indexes de toutes les valeurs des champs du document _timestamp Non Timestamp du document _ttl Non Temps d’expiration du document _size Non Taille du document original (_source)
  • 13. API REST (5) : GET Réponse : HTTP 200 : OK HTTP 404 : NOT FOUND { "_index": "biblio", "_type": "livres", "_id": "1", "_version": 1, "found" : true, "_source" : { "titre": "Shining", "auteur": "Stephen King", "genre": "Fantastique", "date_parution": "28/01/1977" } } curl -XGET 'http://localhost:9200/biblio/livres/1'
  • 14. API REST (6) : UPDATE Si le document existe, il est fusionné, curl -XPOST 'http://localhost:9200/biblio/livres/1/_update ' -d ' { "doc" : { "date_parution": "28/01/1977" }
  • 15. API REST (7) : VERSION Un numéro de version est assigné à la création d’un document. Ce numéro de version est incrémenté pour chaque opération de réindexassions, modifications ou de suppressions. Une opération de modification est validé si le numéro de version de la requête correspond au numéro de version indexé.
  • 16. API REST (8) : SEARCH Requête : curl -XGET 'http://localhost:9200/biblio/_search?q=Shining' curl -XPOST 'http://localhost:9200/index1/type1/_search' –d { } curl -XPOST 'http://localhost:9200/index1/type1,type2/_search' –d { } curl -XPOST 'http://localhost:9200/index1,index2/type1/_search' –d { } curl -XPOST 'http://localhost:9200/_all/type1/_search' –d { }
  • 17. API REST (8) : SEARCH Réponse : { "took":8, "timed_out":false, "_shards": { "total":5, "successful":5, "failed":0 }, "hits": { "total":1, "max_score":0.09289607, "hits":[ { "_index":“ebiznext", "_type":"formation", "_id":"3", "_score":0.09289607, "_source" : { "titre": "Shining", "auteur": "Stephen King", "genre": "Fantastique", "date_parution": "28/01/1977" }}]}}
  • 18. ANALYSE DE TEXTE (1) Les deux requêtes ci-dessous ne retourne aucun document. curl -XPUT 'http://localhost:9200/twitter/tweet/1' -d '{ "user": "david", "message": "C'est mon premier message de la journée !", "postDate": "2014-04-03T15:23:56", "priority": 2 , "rank": 10.2 }' curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=est&pretty=true' curl -XGET 'http://localhost:9200/twitter/tweet/_search?q=journée&pretty=true'
  • 19. ANALYSE DE TEXTE (2) curl -XGET "http://localhost:9200/twitter/_mapping?pretty=true" { "twitter" : { "mappings" : { "tweet" : { "properties" : { "message" : { "type" : "string" }, "postDate" : { "type" : "date", "format" : "dateOptionalTime“}, "priority" : {"type" : "long"}, "rank" : {"type" : "double“ }, "user" : {"type" : "string"} }}}}} Comme on peut le voir ci-dessous, ElasticSearch type automatiquement les champs. Mais le document n’a pas été trouvé lorsque l’on effectue une recherche car il utilise l’Analyseur standard qui ne colle pas à notre besoin.
  • 20. ANALYSE DE TEXTE (3) curl -XGET ‘http://localhost:9200/twitter/_analyze?pretty=true’ -d "C'est" { "tokens" : [ { "token" : "c'est", "start_offset" : 0, "end_offset" : 5, "type" : "<ALPHANUM>", "position" : 1 } ] } curl -XGET "http://localhost:9200/twitter/_analyze?pretty=true" -d "journée" { "tokens" : [ { "token" : "journée", "start_offset" : 0, "end_offset" : 5, "type" : "<ALPHANUM>", "position" : 1 } ] }
  • 21. ANALYSE DE TEXTE (4) curl -XGET "http://localhost:9200/twitter/_analyze?tokenizer=letter&filters=asciifolding,lowercase&pretty=true" -d "c'est" { "tokens" : [ { "token" : "c", "start_offset" : 0, "end_offset" : 1, "type" : "word", "position" : 1 }, { "token" : "est", "start_offset" : 2, "end_offset" : 5, "type" : "word","position" : 2 } ] } curl -XGET "http://localhost:9200/twitter/_analyze?tokenizer=letter&filters=asciifolding,lowercase&pretty=true" -d "journée" { "tokens" : [ { "token" : "journee", "start_offset" : 1, "end_offset" : 8, "type" : "word", "position" : 1 } ] }
  • 22. ANALYSE DE TEXTE (5) Configuration global : curl -XPUT 'http://localhost:9200/twitter' -d '{ "settings" : { "analyzer" : { "myAnalyzer" : { "tokenizer" : "letter", "filter" : ["asciifolding", "lowercase", "mySynonyms"] } "filter" : { "mySynonyms" : { "type" : "synonym", "synonyms" : ["premier, initial"] } } } } }'
  • 23. ANALYSE DE TEXTE : TOKENIZER ET FILTER Un Analyser est composé d’un Tokenizer et de zéro à plusieurs Filters,  Tokenizer : Il permet de scinder un texte en plusieurs éléments. (standard, keyword, whitespace, pattern, letter, custom, etc.)  Filter : Les filtres peuvent modifier ou supprimer Tokens. (lowercase, synonym , asciifolding, nGrams, custom, etc.)
  • 24.
  • 25. MAPPINGS  Elasticsearch est ‘sans schéma’  Configurer seulement au besoin  Mapping dynamique créé pour les types non configurés  Mapping dynamique : appliquer les mappings par défaut pour les informations extraites du document JSON.  Mapping = Définir comment les documents sont analysés et indexés:  Les types des les champs/objets du document.  Les relations entre les documents.  La gestion des méta-données du document.  La définition de la pertinence par champ/document (boosting)
  • 26. MAPPINGS : POURQUOI?  Adapter l’analyse de données à un domaine métier spécifique  Adapter la recherche aux utilisateurs :  terminologies spécifiques, multi-langages.  Certaines fonctionnalités l’exigent  Tri,  Agrégation  Hilighting
  • 27. MAPPINGS API  Création de mappings lors de la création d’index :  Récupération du mapping : curl -XPOST localhost:9200/crunchbase -d '{ "settings" : { "number_of_shards" : 1 }, "mappings" : { "company" : { "_source" : { "enabled" : false }, "properties" : { "name" : { "type" : "string", "analyzer" : "standard" } } } } }' Curl –XGET ‘localhost:9200/crunchbase/_mapping/company’
  • 28. MAPPINGS : TYPES Type Attribut Description String Index analyzed : indexé, analysé. not_analyzed : indexé mais pas analysé. no : non indexé. Analyzer définit l’analyseur qui sera utilisé lors de l’indexation ou de la recherche. Nombres ignore_malformed ignorer un nombre mal formaté. valeur par défaut : false Coerce convertit les strings en nombres. valeur par défaut : false Date Format format attendu. exemple : yyy/MM/dd ignore_malformed ignorer les valeurs mal formatées
  • 29. { "tweet" : { "properties" : { "name" : { "type" : "multi_field", "fields" : { "name":{"type":"string","index":"analyzed"}, "untouched":{"type":"string","index":"not_analyzed"} } } } } } MULTI-FIELDS  Le multi-field permet d’indexer un champ du document sous plusieurs formes  cas d’utilisation : utiliser plusieurs analyseurs pour le même champ
  • 30. RELATIONS (1) : LES TYPES ‘NESTED’ VS PARENT/FILS  Nested : Les objets de la relations sont stockés dans le même document  Parent/fils : le pères et ses fils sont stockés dans des documents séparés { "employee" : { "_parent" : { "type" : "blog " } } } { "company" : { "properties" : { "product" : { "type" : "nested", "properties": { "name" : {"type": "string", "index": "not_analyzed"}, "count" : {"type": "integer"} } } } } }
  • 31. RELATIONS (2) : LES TYPES ‘NESTED’ VS PARENT/FILS  Les types ‘nested’  Lecture rapide : les documents sont stockés dans le même block Lucene.  Mise à jour est couteuse : ES réindexe tout le document si le document ‘nested’ est mis à jour  Moins flexible : mieux adapté pour les données qui ne changent pas souvent  Parent/fils  Moins performant : Père et fils sont stockés dans des documents séparés (mais dans le même shard)  Plus de mémoire : Les IDs sont chargés en mémoire.  Flexible : Parent et fils sont modifiés séparément, pas de re- indexation
  • 32. RECHERCHE : QUERY DSL  Le query DSL (Domain Specific Language) permet d’exprimer des définitions complexes de requêtes.  Il existes deux types de query DSL :  Requêtes :  Utilisé pour la recherche full text  Le résultat dépend d’un score attribué aux documents  Pas d’utilisation de cache  Filtres :  Pas de manipulation de scores.  Utilisation de cache.
  • 33. RECHERCHE : EXEMPLES Requêtes Filtres Boosting Query Constant Score Query And Filter Bool Filter Not Filter Or Filter Match Query Multi Match Query Term Filter Terms Filter Match All Query GeoShape Filter Has Child Query Has Parent Query Nested Query Has Child Filter Has Parent Filter Nested Filter Regexp Filter Script Filter
  • 34. HIGHLIGHT DES RÉSULTAT DE LA RECHERCHE  Highlight : montrer des extraits du texte correspondant au résultat de la requête "query" : { "match" : { "title" : "branches" } }, "highlight" : { "fields" : { "content" : {} } }
  • 35. SUGGESTION  Suggestion : suggérer des termes similaires à la recherche.
  • 36.
  • 37. PERCOLATOR  Le percolateur permet de savoir quelle requête correspond à un document donné  Fonctionnement inversé de la recherche  Cas d’utilisation :  Alertes et monitoring  Enregistrement d’une requête curl -XPUT 'localhost:9200/my-index/.percolator/1' -d '{ "query" : { "match" : { "message" : "bonsai tree" } } }’
  • 38. PERCOLATOR  Commande permettant de savoir quelle requête correspond au document donné  Réponse : l’id de la requête qui ‘matche’ le document curl -XGET 'localhost:9200/my-index/message/_percolate' -d '{ "doc" : { "message" : "A new bonsai tree in the office" } }' {"took" : 19, "_shards" : { … }, "total" : 1, "matches" : [{ "_index" : "my-index", "_id" : "1" }]}
  • 39. PLUGINS  ElasticSearch dispose de son propre système de plugins qui permet d’enrichir les fonctionnalités de base. Plusieurs plugins sont développés par Elasticsearch ou par la communauté. On distingue :  Les analyseurs : Ensemble de filtres et séparateurs pour supporter les langues.  Les rivières : Les rivers (rivières) ont pour rôle d’injecter les données provenant de divers sources de données dans ElasticSearch. Il existe 4 rivières standards : CouchDB, RabbitMQ, Twitter et Wikipedia.  Il y a également plusieurs autres rivières développées par la communauté qui permettent d’injecter les données provenant de MongoDB, Neo4J, flux RSS, Git…  Support des scripts : Clojure, Groovy, Javascript…
  • 40. Q&R