Upload
silicon-comte
View
523
Download
0
Embed Size (px)
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
Citation preview
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.
APRÈS LE DIGITAL APÉRODoc :
Indexer des fichiers (depuis 1.4) : More Like this : ou
elasticsearch.org/guide/JDBC River pour indexation SQL
Attachement MappingQuery API
Infos sur la résilience