SlideShare une entreprise Scribd logo
1  sur  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

Contenu connexe

Tendances

Elastic search overview
Elastic search overviewElastic search overview
Elastic search overviewABC Talks
 
Elasticsearch From the Bottom Up
Elasticsearch From the Bottom UpElasticsearch From the Bottom Up
Elasticsearch From the Bottom Upfoundsearch
 
Introduction to Elasticsearch
Introduction to ElasticsearchIntroduction to Elasticsearch
Introduction to ElasticsearchRuslan Zavacky
 
Introduction to elasticsearch
Introduction to elasticsearchIntroduction to elasticsearch
Introduction to elasticsearchhypto
 
Introduction to Elasticsearch with basics of Lucene
Introduction to Elasticsearch with basics of LuceneIntroduction to Elasticsearch with basics of Lucene
Introduction to Elasticsearch with basics of LuceneRahul Jain
 
Introduction to elasticsearch
Introduction to elasticsearchIntroduction to elasticsearch
Introduction to elasticsearchpmanvi
 
MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?Sébastien Prunier
 
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]MongoDB
 
ElasticSearch Basic Introduction
ElasticSearch Basic IntroductionElasticSearch Basic Introduction
ElasticSearch Basic IntroductionMayur Rathod
 
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
 
An Introduction to Elastic Search.
An Introduction to Elastic Search.An Introduction to Elastic Search.
An Introduction to Elastic Search.Jurriaan Persyn
 
What I learnt: Elastic search & Kibana : introduction, installtion & configur...
What I learnt: Elastic search & Kibana : introduction, installtion & configur...What I learnt: Elastic search & Kibana : introduction, installtion & configur...
What I learnt: Elastic search & Kibana : introduction, installtion & configur...Rahul K Chauhan
 
Spark (Structured) Streaming vs. Kafka Streams
Spark (Structured) Streaming vs. Kafka StreamsSpark (Structured) Streaming vs. Kafka Streams
Spark (Structured) Streaming vs. Kafka StreamsGuido Schmutz
 
[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화NAVER D2
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리Junyi Song
 
MongoDB vs. Postgres Benchmarks
MongoDB vs. Postgres Benchmarks MongoDB vs. Postgres Benchmarks
MongoDB vs. Postgres Benchmarks EDB
 

Tendances (20)

Elastic search overview
Elastic search overviewElastic search overview
Elastic search overview
 
Elasticsearch From the Bottom Up
Elasticsearch From the Bottom UpElasticsearch From the Bottom Up
Elasticsearch From the Bottom Up
 
Introduction to Elasticsearch
Introduction to ElasticsearchIntroduction to Elasticsearch
Introduction to Elasticsearch
 
Introduction to elasticsearch
Introduction to elasticsearchIntroduction to elasticsearch
Introduction to elasticsearch
 
Elasticsearch Introduction
Elasticsearch IntroductionElasticsearch Introduction
Elasticsearch Introduction
 
Elasticsearch
ElasticsearchElasticsearch
Elasticsearch
 
Introduction to Elasticsearch with basics of Lucene
Introduction to Elasticsearch with basics of LuceneIntroduction to Elasticsearch with basics of Lucene
Introduction to Elasticsearch with basics of Lucene
 
Introduction to elasticsearch
Introduction to elasticsearchIntroduction to elasticsearch
Introduction to elasticsearch
 
MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?MongoDB et Elasticsearch, meilleurs ennemis ?
MongoDB et Elasticsearch, meilleurs ennemis ?
 
Solr Presentation
Solr PresentationSolr Presentation
Solr Presentation
 
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
Naver속도의, 속도에 의한, 속도를 위한 몽고DB (네이버 컨텐츠검색과 몽고DB) [Naver]
 
ElasticSearch Basic Introduction
ElasticSearch Basic IntroductionElasticSearch Basic Introduction
ElasticSearch Basic Introduction
 
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
 
An Introduction to Elastic Search.
An Introduction to Elastic Search.An Introduction to Elastic Search.
An Introduction to Elastic Search.
 
The basics of fluentd
The basics of fluentdThe basics of fluentd
The basics of fluentd
 
What I learnt: Elastic search & Kibana : introduction, installtion & configur...
What I learnt: Elastic search & Kibana : introduction, installtion & configur...What I learnt: Elastic search & Kibana : introduction, installtion & configur...
What I learnt: Elastic search & Kibana : introduction, installtion & configur...
 
Spark (Structured) Streaming vs. Kafka Streams
Spark (Structured) Streaming vs. Kafka StreamsSpark (Structured) Streaming vs. Kafka Streams
Spark (Structured) Streaming vs. Kafka Streams
 
[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화[2D1]Elasticsearch 성능 최적화
[2D1]Elasticsearch 성능 최적화
 
elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리elasticsearch_적용 및 활용_정리
elasticsearch_적용 및 활용_정리
 
MongoDB vs. Postgres Benchmarks
MongoDB vs. Postgres Benchmarks MongoDB vs. Postgres Benchmarks
MongoDB vs. Postgres Benchmarks
 

Similaire à 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
 

Similaire à 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