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
2. PRÉSENTATION
Développeur web indépendant depuis 2004
PHP
Symfony
MySQL
Intégration / Responsive
Elastic Search
etc...
nyroDev
3. Open source
Un indexeur de documents (basé sur Apache Lucene)
Une API HTTP/RESTFul/JSON
Distribué
Simple et puissant à la fois
En quasi temps réel
Mais ce n'est pas une base de données
4. ROUTE DES COMMUNES
Editorial 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
5. RECHERCHE MYSQL : "NYRODEV"
UNIQUEMENT SUR LE TITRE
SELECT * FROM entreprise WHERE name LIKE "%nyrodev%"
12ms
6. RECHERCHE MYSQL : "NYRODEV"
SUR LES CHAMPS TEXTES
SELECT * FROM entreprise
WHERE name LIKE "%nyrodev%" OR responsable LIKE "%nyrodev%"
OR description LIKE "%nyrodev%" OR activite_principale LIKE "%nyrodev%"
OR activite_secondaire LIKE "%nyrodev%"
13ms
7. RECHERCHE MYSQL : "NYRODEV NIROUSSET"
UNIQUEMENT SUR LE TITRE
SELECT * FROM entreprise WHERE name LIKE "%nyrodev%" AND name LIKE "%nirousset%"
13ms
0 résultat
8. RECHERCHE MYSQL : "NYRODEV NIROUSSET"
SUR LES CHAMPS TEXTES
SELECT * FROM entreprise
WHERE (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
9. ET ON POURRAIT AJOUTER :
D'autres champs textes existants
Recherche sur la commune (jointure)
Recherche sur les publicités (jointure)
ET ON NE CHERCHE QUE SUR LES
ENTREPRISES !
10. QUELQUES TERMES
Document : Un object JSON représentant les données
Penser NoSQL
(donc jointures incluses et "applaties")
Type : Regroupe des documents du même type
Index Espace logique de stockage des documents dont les
types sont fonctionnellement communs
11. API DE BASE D'ELASTIC SEARCH
API REST : http://host:port/[index]/[type]/[_action/_id]
Documents :
curl -XPUT http://localhost:9200/rdc/entreprise/1
curl -XGET http://localhost:9200/rdc/entreprise/1
curl -XDELETE http://localhost:9200/rdc/entreprise/1
Recherche :
curl -XPOST http://localhost:9200/rdc/entreprise/_search
curl -XPOST http://localhost:9200/rdc/_search
curl -XPOST http://localhost:9200/_search
13. GAGNER DU TEMPS DE DÉVELOPPEMENT
De nombreuses librairies dans beaucoup de langages existes
pour faire des requêtes en objet
Elastica en PHP
Des libraires permettent d'ajouter/modifier/supprimer les
données avec les modifs en Base de données
Avec Symfony, FOSElasticaBundle
14. RIVERS
C'est Elastic Search qui va lire et indexer les données.
CouchDb
MongoDb
JDBC (pour MySQL par exemple)
RabbitMQ
Twitter
Wikipedia
FileSystem
IMAP/POP3 Email
RSS
Git ou GitHub
Et plein d'autres
16. LES RÉSULTATS
10 résultats sont retournés par défaut
paramétrable avec from et size
Le tri se fait par défaut sur le _score
paramétrable avec _sort
17. 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
19. QUERY OU FILTER
On 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 score
Certains Query peuvent contenir des filter
Donc : Utiliser des filter le plus possible
20. QUELQUES AUTRES TYPES DE RECHERCHES
Range : Un intervalle de chiffres ou date
Prefix : Mot commençant par
Geodistance : A moins de X km d'un point GPS
Regexp : Expression régulière
Match All : Pour récupérer toutes les données
21. LES FACETTES
OU AGGREGATION DEPUIS 1.1
Avec une recherche, on peut demander des compteurs sur les
données
Compteurs sur les terms
Intervalles sur des chiffres ou dates
Intervalles sur des distances GPS
25. ET D'AUTRES...
Aggrégation d'aggrégations
Geo distance
Filter (pour des aggrégations encore plus spécifiques)
Intervalle pour nombres ou date
26. POUR ALLER PLUS LOIN
Mappings pour indiquer les types de données
Analyzers et Tokenizers
Suggesters pour autocompletion avancée et rapide
Script pour custom score et autres... (ressemble à du
JavaScript)
Percolators : enregister les requêtes pour ensuite récupérer
les requêtes qui matchent un document
27. AVANT LA MISE EN PROD
Protéger l'accès à ElasticSearch (port 9200)
ou n'écouter qu'en local avec la configuration
network.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;
}
}
28. INSTALLER 2 PLUGINS
Bigdesk pour monitoring et review de la santé de son serveur
Head pour avoir une vision global sur son cluster via son
navigateur et exécuter des requêtes
29.
30. C'EST UN ELK
ÉLAN OU WAPITI
Elasticsearch
Logstash : Indexer des log dans Elasticsearch et les analyser
Kibana : Visualitaion des données ElasticSearch en dashboard
et graphiques
32. APRÈS LE DIGITAL APÉRO
Doc :
elasticsearch.org/guide/
JDBC River pour indexation SQL
Indexer des fichiers (depuis 1.4) :
Attachement Mapping
More Like this : ou
Query API
Infos sur la résilience