présentation de elasticsearch / digital apéro du 12/11/2014

32
ELASTIC SEARCH DIGITAL APÉRO SILICONCOMTÉ par - Cédric Nirousset @Nyr0

Upload: silicon-comte

Post on 07-Jul-2015

524 views

Category:

Software


0 download

DESCRIPTION

ElasticSearch est un moteur de recherche open source reposant sur une interface JSON, pouvant fonctionner en mode distribué et interrogeable facilement via son API REST. Cédric Nirousset, Développeur web indépendant, vous fera découvrir les intérêts de l’utiliser dans vos applications à travers quelques exemples pratiques. A propos de l’intervenant : Cédric Nirousset, diplomé dut DUT SRC Montébliard en 2006 et de l’UTBM en Informatique en 2010, il est maintenant développeur web indépendant à Besançon, travaillant pour des entreprises de toutes tailles et tous horizons. Suivez Cédric sur Twitter @Nyr0

TRANSCRIPT

Page 1: Présentation de ElasticSearch / Digital apéro du 12/11/2014

ELASTIC SEARCHDIGITAL APÉRO SILICONCOMTÉ

par - Cédric Nirousset @Nyr0

Page 2: Présentation de ElasticSearch / Digital apéro du 12/11/2014

PRÉSENTATIONDéveloppeur web indépendant depuis 2004

PHPSymfonyMySQL

Intégration / ResponsiveElastic Search

etc...nyroDev

Page 3: Présentation de ElasticSearch / Digital apéro du 12/11/2014

Open sourceUn indexeur de documents (basé sur Apache Lucene)Une API HTTP/RESTFul/JSONDistribuéSimple et puissant à la foisEn quasi temps réelMais ce n'est pas une base de données

Page 4: Présentation de ElasticSearch / Digital apéro du 12/11/2014

ROUTE DES COMMUNESEditorial et contenus sur :

4 départements de Franche-Comté67 communautés de communes de Franche-Comté103 cantons de Franche-Comté1 785 communes de Franche-Comté5 000 entreprises de Franche-Comté2 524 activités

soit un total d'environ 9 500 lignes, stockées en MySQL

Page 5: Présentation de ElasticSearch / Digital apéro du 12/11/2014

RECHERCHE MYSQL : "NYRODEV"UNIQUEMENT SUR LE TITRE

SELECT * FROM entreprise WHERE name LIKE "%nyrodev%"

12ms

Page 6: Présentation de ElasticSearch / Digital apéro du 12/11/2014

RECHERCHE MYSQL : "NYRODEV"SUR LES CHAMPS TEXTES

SELECT * FROM entrepriseWHERE name LIKE "%nyrodev%" OR responsable LIKE "%nyrodev%"OR description LIKE "%nyrodev%" OR activite_principale LIKE "%nyrodev%"OR activite_secondaire LIKE "%nyrodev%"

13ms

Page 7: Présentation de ElasticSearch / Digital apéro du 12/11/2014

RECHERCHE MYSQL : "NYRODEV NIROUSSET"UNIQUEMENT SUR LE TITRE

SELECT * FROM entreprise WHERE name LIKE "%nyrodev%" AND name LIKE "%nirousset%"

13ms0 résultat

Page 8: Présentation de ElasticSearch / Digital apéro du 12/11/2014

RECHERCHE MYSQL : "NYRODEV NIROUSSET"SUR LES CHAMPS TEXTES

SELECT * FROM entrepriseWHERE (name LIKE "%nyrodev%" OR responsable LIKE "%nyrodev%"OR description LIKE "%nyrodev%" OR activite_principale LIKE "%nyrodev%"OR activite_secondaire LIKE "%nyrodev%")AND (name LIKE "%nirousset%" OR responsable LIKE "%nirousset%"OR description LIKE "%nirousset%" OR activite_principale LIKE "%nirousset%"OR activite_secondaire LIKE "%nirousset%")

14ms

Page 9: Présentation de ElasticSearch / Digital apéro du 12/11/2014

ET ON POURRAIT AJOUTER :D'autres champs textes existantsRecherche sur la commune (jointure)Recherche sur les publicités (jointure)

ET ON NE CHERCHE QUE SUR LESENTREPRISES !

Page 10: Présentation de ElasticSearch / Digital apéro du 12/11/2014

QUELQUES TERMESDocument : Un object JSON représentant les donnéesPenser NoSQL(donc jointures incluses et "applaties")Type : Regroupe des documents du même typeIndex Espace logique de stockage des documents dont lestypes sont fonctionnellement communs

Page 11: Présentation de ElasticSearch / Digital apéro du 12/11/2014

API DE BASE D'ELASTIC SEARCHAPI REST : http://host:port/[index]/[type]/[_action/_id]Documents :

curl -XPUT http://localhost:9200/rdc/entreprise/1curl -XGET http://localhost:9200/rdc/entreprise/1curl -XDELETE http://localhost:9200/rdc/entreprise/1

Recherche :curl -XPOST http://localhost:9200/rdc/entreprise/_searchcurl -XPOST http://localhost:9200/rdc/_searchcurl -XPOST http://localhost:9200/_search

Page 12: Présentation de ElasticSearch / Digital apéro du 12/11/2014

INDEXER UN DOCUMENTcurl -XPUT http://localhost:9200/rdc/entreprise/1 -d '{ "name": "nyroDev", "responsable": "Cédric Nirousset", "description": "Développeur web", "activite_principale": "Développement web", "activite_secondaire": "Hébergement web, conseils", "commune": { "name": "Besançon", "code_postal": "25000" }}'

Réponse :{ "ok": true, "_index": "rdc", "_type": "entreprise", "_id": "1"}

Page 13: Présentation de ElasticSearch / Digital apéro du 12/11/2014

GAGNER DU TEMPS DE DÉVELOPPEMENTDe nombreuses librairies dans beaucoup de langages existes

pour faire des requêtes en objet en PHPElastica

Des libraires permettent d'ajouter/modifier/supprimer lesdonnées avec les modifs en Base de données

Avec Symfony, FOSElasticaBundle

Page 14: Présentation de ElasticSearch / Digital apéro du 12/11/2014

RIVERSC'est Elastic Search qui va lire et indexer les données.

CouchDbMongoDbJDBC (pour MySQL par exemple)RabbitMQTwitterWikipediaFileSystemIMAP/POP3 EmailRSSGit ou GitHubEt plein d'autres

Page 15: Présentation de ElasticSearch / Digital apéro du 12/11/2014

CHERCHERcurl -XPOST http://localhost:9200/rdc/entreprise/_search?q=nyrodev

Résultat :{ "took": 1, "timed_out": false, "_shards": { "total": 5, "successful": 5, "failed": 0 }, "hits": { "total": 1, "max_score": 0.61319745, "hits": [{ "_index": "rdc", "_type": "entreprise", "_id": "1", "_score": 0.61319745, "_source": { "name": "nyroDev", /* ... */ } }] }}

Page 16: Présentation de ElasticSearch / Digital apéro du 12/11/2014

LES RÉSULTATS10 résultats sont retournés par défaut

paramétrable avec from et size

Le tri se fait par défaut sur le _scoreparamétrable avec _sort

Page 17: Présentation de ElasticSearch / Digital apéro du 12/11/2014

ET SI ON COMPARAIT AVEC MYSQL ?Recherche global sur tout l'index rdc (entreprise, publicité,

communes, etc...)http://localhost:9200/rdc/_search?q=nyrodev

8ms

http://localhost:9200/rdc/_search?q=nyrodev nirousset

11ms

12 ms en MySQL juste sur le nom de l'entreprise

Page 18: Présentation de ElasticSearch / Digital apéro du 12/11/2014

QUERY DSLPossibilité de faire des recherches précises

curl -XPOST http://localhost:9200/rdc/entreprise/_search -d '{ "query": { "bool": { "must": [{ "query_string": { "query": "développeur" } }], "must_not": [{ "query_string": { "query": "chameau" } }], "should": [{ "query_string": { "query": "web" } }] } }}'

Page 19: Présentation de ElasticSearch / Digital apéro du 12/11/2014

QUERY OU FILTEROn peut affiné une recherche avec des query ou des filters.

On retrouve beaucoup de query et filter qui font la même chose.Comment faire la différence ?

Filter : Mis en cache mais n'influence par le scoreCertains Query peuvent contenir des filterDonc : Utiliser des filter le plus possible

Page 20: Présentation de ElasticSearch / Digital apéro du 12/11/2014

QUELQUES AUTRES TYPES DE RECHERCHESRange : Un intervalle de chiffres ou datePrefix : Mot commençant parGeodistance : A moins de X km d'un point GPSRegexp : Expression régulièreMatch All : Pour récupérer toutes les données

Page 21: Présentation de ElasticSearch / Digital apéro du 12/11/2014

LES FACETTESOU AGGREGATION DEPUIS 1.1

Avec une recherche, on peut demander des compteurs sur lesdonnées

Compteurs sur les termsIntervalles sur des chiffres ou datesIntervalles sur des distances GPS

Page 22: Présentation de ElasticSearch / Digital apéro du 12/11/2014

AGGRÉGATION SUR LES MOTScurl -XPOST http://localhost:9200/rdc/entreprise/_search -d '{ "query": { /* ... */ }, "aggs": { "words": { "terms": { "field": "activite_principale" } } }}'

Résultats{ "took": 150, "hits": { /* ... */ } "aggregations": { "words": { "buckets": [ { "key": "de", "doc_count": 169 }, { "key": "coiffure", "doc_count": 166 }, { "key": "restaurant", "doc_count": 158 }, /* ... */ ] } }}

Page 23: Présentation de ElasticSearch / Digital apéro du 12/11/2014

AGGRÉGATION SUR LES MOTS AVEC QUERYcurl -XPOST http://localhost:9200/rdc/entreprise/_search -d '{ "query": { "term": { "activite_principale": "restaurant" } }, "aggs": { "words": { "terms": { "field": "activite_secondaire" } } }}'

Résultats{ "took": 68, "hits": { /* ... */ } "aggregations": { "words": { "buckets": [ { "key": "bar", "doc_count": 41 }, { "key": "pizzeria", "doc_count": 18 }, { "key": "traiteur", "doc_count": 11 }, /* ... */ ] } }}

Page 24: Présentation de ElasticSearch / Digital apéro du 12/11/2014

AGGRÉGATION SUR LES DATEScurl -XPOST http://localhost:9200/rdc/entreprise/_search -d '{ "aggs": { "dates": { "date_histogram": { "field": "updated", "interval": "day", "format": "yyyy-MM-dd" } } }}'

Résultats{ "took": 66, "hits": { /* ... */ } "aggregations": { "dates": { "buckets": [ { "key_as_string": "2014-10-01", "doc_count": 123}, { "key_as_string": "2014-10-02", "doc_count": 8}, { "key_as_string": "2014-10-03", "doc_count": 23}, /* ... */ ] } }}

Page 25: Présentation de ElasticSearch / Digital apéro du 12/11/2014

ET D'AUTRES...Aggrégation d'aggrégationsGeo distanceFilter (pour des aggrégations encore plus spécifiques)Intervalle pour nombres ou date

Page 26: Présentation de ElasticSearch / Digital apéro du 12/11/2014

POUR ALLER PLUS LOINMappings pour indiquer les types de donnéesAnalyzers et TokenizersSuggesters pour autocompletion avancée et rapideScript pour custom score et autres... (ressemble à duJavaScript)Percolators : enregister les requêtes pour ensuite récupérerles requêtes qui matchent un document

Page 27: Présentation de ElasticSearch / Digital apéro du 12/11/2014

AVANT LA MISE EN PRODProtéger l'accès à ElasticSearch (port 9200)

ou n'écouter qu'en local avec la configurationnetwork.host: 127.0.0.1

Laisser 1 porte via nginx:server { listen 9292; server_name domain.tld; auth_basic "RESTRICTED ACCESS"; auth_basic_user_file /var/my/access/.htpasswd; location / { proxy_pass http://localhost:9200; proxy_redirect off; proxy_set_header X-Real-IP $remote_addr; proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for; proxy_set_header Host $http_host; }}

Page 28: Présentation de ElasticSearch / Digital apéro du 12/11/2014

INSTALLER 2 PLUGINSBigdesk pour monitoring et review de la santé de son serveur

Head pour avoir une vision global sur son cluster via sonnavigateur et exécuter des requêtes

Page 29: Présentation de ElasticSearch / Digital apéro du 12/11/2014
Page 30: Présentation de ElasticSearch / Digital apéro du 12/11/2014

C'EST UN ELKÉLAN OU WAPITI

ElasticsearchLogstash : Indexer des log dans Elasticsearch et les analyserKibana : Visualitaion des données ElasticSearch en dashboardet graphiques

Page 31: Présentation de ElasticSearch / Digital apéro du 12/11/2014

QUESTIONS ?MERCI.