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

Post on 07-Jul-2015

524 Views

Category:

Software

0 Downloads

Preview:

Click to see full reader

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

ELASTIC SEARCHDIGITAL APÉRO SILICONCOMTÉ

par - Cédric Nirousset @Nyr0

PRÉSENTATIONDéveloppeur web indépendant depuis 2004

PHPSymfonyMySQL

Intégration / ResponsiveElastic Search

etc...nyroDev

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

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

RECHERCHE MYSQL : "NYRODEV"UNIQUEMENT SUR LE TITRE

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

12ms

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

RECHERCHE MYSQL : "NYRODEV NIROUSSET"UNIQUEMENT SUR LE TITRE

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

13ms0 résultat

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

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 !

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

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

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

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

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

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", /* ... */ } }] }}

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

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

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" } }] } }}'

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

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

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

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 }, /* ... */ ] } }}

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 }, /* ... */ ] } }}

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}, /* ... */ ] } }}

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

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

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; }}

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

C'EST UN ELKÉLAN OU WAPITI

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

QUESTIONS ?MERCI.

top related