Elasticsearch est un moteur de recherche distribué, RESTful, reposant sur la bibliothèque Apache Lucene et sous licence Apache 2.
En un an, depuis sa sortie en version 0.90, sa popularité et ses fonctionnalités n'ont cessé de croître.
Note: Si vous n'avez jamais joué avec Elasticsearch, il est plus intéressant de commencer par le test.
Sommaire
- Nouveautés
- Quelles limites ?
- L'entreprise
- Tester Elasticsearch
- Qui utilise Elasticsearch ?
Nouveautés
Après deux beta et une RC, la version une d'Elasticsearch est prête pour la production.
Les principales fonctionnalités ajoutées depuis la 0.90 sont listées ci-dessous par ordre d’apparition dans les billets du blog : Blog | Elasticsearch.org.
Le 6 novembre 2013, 1.0.0.Beta1 released
Distributed percolation
Le percolator propose d'inverser la logique de recherche parmi des documents indexés. Ici ce sont les requêtes qui sont enregistrées et on leur soumet des documents.
Dans la première version du percolator, toutes les requêtes étaient enregistrées dans un index système, dédié, nommé _percolator
et composé d'un seul shard répliqué sur chaque node.
Cette méthode a rapidement montré ses limites en terme de performance.
La nouvelle conception permet d'enregistrer des requêtes de percolation dans n'importe quel index, et c'est maintenant un type .percolator
qui leur est dédié. Cela permet une liberté plus grande dans la configuration et des requêtes exécutées en parallèle sur tous les shards.
Tous les détails dans l'article dédié : Redesigned percolator et dans la documentation Percolator.
Doc Values
Pour certaines opérations, le faceting et le tri, Elasticsearch doit charger en mémoire toutes les valeurs d'un champ ce qui pose problème quand le nombre de valeurs uniques est très grand. Une nouvelle option, à positionner dans le mapping (c'est donc un choix à faire à l'indexation), permet de stocker la structure fielddata
sur disque. C'est bien sûr plus lent, mais peut être très utile.
Tous les détails dans l'article dédié : Disk-based field data a.k.a. doc values
Stopwords disabled by default
Une des étapes classiques de traitement du texte avant indexation est la suppression des mots vides (stop words). En effet tout ces petits mots sont très fréquents et vides de sens. Pourtant ils sont parfois discriminants.
Et bien il n'est plus nécessaire de les supprimer. Une nouvelle option dans les requêtes match
, cutoff_frequency
et un nouveau type de requête common
permet de choisir lors de la requête la prise en compte des mots vides.
Tous les détails dans l'article dédié : Stop stopping stop words: a look at Common Terms Query
Le 2 décembre 2013, 1.0.0.Beta2 released.
Snapshot / Restore
Avant cette version une, pour faire un backup il fallait couper le flush, trouver les chemins vers le stockage des primary shard et jouer du rsync
, sans oublier de réactiver le flush (flush API).
L'API _snapshot
fait donc son apparition. La bonne nouvelle c'est que les snapshots sont incrémentaux. Le stockage peut être un système de fichier local ou distant: S3, Azure ou encore HDFS.
Tous les détails dans l'article dédié : Introducing Snapshot & Restore
cat API
L'idée derrière l'API cat
est très simple, il y a des jours où on est fatigué de lire du json, et puis ce n'est pas toujours facile d'en extraire des données avec les outils unix classiques.
C'est donc un ensemble complet de commandes qui donnent des informations sous forme lisible pour un humain. Elles disposent toutes d'une option help
ainsi que d'un mode bavard v
qui ajoute les entêtes.
Tous les détails dans l'article dédié : Introducing: The cat API
Aggregations
Dès le départ, les capacités d’agrégation et d'inspection des données (Slice & Dice) ont été mises en avant et de fait les facets ont très certainement contribué au succès d'Elasticsearch.
Malheureusement, les facets étaient limitées à de simples regroupements de documents pour les compter. Et ce, sur un seul niveau. Impossible de regrouper des documents par type puis par date par exemple. Seule la statistical facet permettait d'aller plus loin en effectuant des calculs sur un champs numérique.
Aggregations est une toute nouvelle API qui propose deux familles d'agrégateur : regroupement (Bucketing) et calculs (Metric). Ceux-ci peuvent être composés librement et imbriqués !
Je vous laisse découvrir les exemples en suivant les liens :
Tous les détails dans l'article dédié: Pas encore d'article dédié
Le 15 janvier 2014, 1.0.0.RC1 released
Federated search
Cette nouveauté apparue tout récemment dans cette RC1, sans prévenir je dirais, est marquée experimental. Le but est d'effectuer des requêtes (au sens large) sur plusieurs cluster depuis un nouveau type de nœud tribe, qui se comporte comme nœud client sur tous les clusters enregistrés.
La documentation est actuellement assez brève : tribe node
simple_query_string
La syntaxe Query String de Lucene, accessible via les requêtes du même nom (query string query) est très puissante, mais très sensible aux erreurs de syntaxe.
La syntaxe simple_query_string se veut plus simple, plus limité, bien sûr, mais surtout est prévue pour faire de son mieux avec les erreurs et ne surtout pas échouer.
Pratique si on ne veut pas développer sa propre syntaxe ou avoir à vérifier la query string en amont.
La documentation : Simple Query String Query
Le 3 février 2014, 0.90.11 and 1.0.0.RC2 released
Vitesse et consommation mémoire
De nombreux commits ont eu pour but d'améliorer les performances, réduire la consommation mémoire et améliorer la stabilité. Il serait trop fastidieux de les lister ici.
Clients officiels
C'est indépendant de la sortie de la version une, mais néanmoins important.
Elasticsearch a maintenant un jeux de clients officiels maintenus par les développeurs d'Elasticsearch.
L'objectif est que l'utilisation d'Elasticsearch soit aussi facile, efficace et homogène, quelque soit le langage choisi, pour l'instant parmi JS, Perl, PHP, Python et Ruby.
Tous les détails dans l'article dédié: Release the clients! Ruby, Python, PHP, Perl.
Dépôt deb et rpm
Finalement pour les plus admin d'entre nous, ils ont mis en place des dépôts deb et rpm : Announcing Deb and Rpm Repositories
Le 12 février 2014, 1.0.0 Released
En complément quelques vidéos et des présentations issue d'une rencontre des développeurs Elasticsearch est disponible : Meet-the-Devs Meetup in Amsterdam
Quelles limites ?
Si Elasticsearch a des limites (et il en a sûrement) elles sont très élevées.
Un des plus gros client semble être Fog Creek, qui indexe 100 000 dépôts de code qui représenteraient 50 milliards de lignes de code.
En taille de cluster il semblerait qu'il existe au moins un cluster de 200 noeuds .
L'entreprise
Recrutement
Un an et demi après sa fondation, la société compte plus de 50 salariés. La plupart du temps les embauches sont annoncées sur le blog de la société : elasticsearch.com - blog
On peut remarquer dans cette liste l'embauche de Rashid Khan, le développeur de Kibana et de Jordan Sissel le développeur de Logstash. Cela montre une forte volonté de la part d'Elaticsearch de maîtriser la croissance de la stack ELK (Elasticsearch/Logstash/Kibana) qui est devenue la figure de proue du projet. Voir cette démo : #logstash sur irc.freenode.org ou celle-ci http://demo.kibana.org/#/dashboard .
Et sinon, on compte au moins un français de plus, Adrien Grand, qui est aussi commiter Lucene : welcome adrien .
Modèle économique
Avec deux levées de fond pour un total de 34 millions de dollars, la société n'est pas dans le besoin, mais elle doit trouver son modèle économique.
Pour l'instant seules les formations et le support sont payant. Ce sont les équipes de développements qui les assurent.
Un module de management et monitoring nommé Marvel arrive avec la version 1. Celui-ci est payant ou offert avec le support. (l'annonce Introducing Elasticsearch Marvel)
Tester Elasticsearch
Pouvoir tester Elasticsearch en cinq minutes sur son ordinateur reste une des forces de ce logiciel. Voici quelques étapes pour le découvrir. (Le précédent test Tester ElasticSearch 0.90)
Télécharger l'archive
$ wget https://download.elasticsearch.org/elasticsearch/elasticsearch/elasticsearch-1.0.0.tar.gz
$ tar xvf elasticsearch-1.0.0.tar.gz
Lancer Elasticsearch
$ cd elasticsearch-1.0.0/
$ bin/elasticsearch
$ curl http://127.0.0.1:9200
{
"status" : 200,
"name" : "Slug",
"version" : {
"number" : "1.0.0",
"build_hash" : "a46900e9c72c0a623d71b54016357d5f94c8ea32",
"build_timestamp" : "2014-02-12T16:18:34Z",
"build_snapshot" : false,
"lucene_version" : "4.6"
},
"tagline" : "You Know, for Search"
}
Indexer
$ curl -s -XPOST localhost:9200/_bulk --data-binary '{"index":{"_index":"test", "_type":"entry", "_id":
{"model": "T-Shirt", "color":"black", "size":"XL", "stock":10, "orders":2}
{"index":{"_index": "test", "_type":"entry", "_id":2}}
{"model": "T-Shirt", "color":"black", "size":"L", "stock":3, "orders": 9}
{"index":{"_index": "test", "_type":"entry", "_id":3}}
{"model": "T-Shirt", "color":"black", "size":"S", "stock":5, "orders":0}
{"index":{"_index": "test", "_type":"entry", "_id":4}}
{"model": "T-Shirt", "color":"white", "size":"L", "stock":1, "orders":1}
'
C'est un exemple d'utilisation de la Bulk API
Rechercher
$ curl -XPOST http://localhost:9200/test/_search?pretty=true -d '{"query": {"match":{"size":"l"}}}'
{
"took" : 87,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 2,
"max_score" : 0.30685282,
"hits" : [ {
"_index" : "test",
"_type" : "entry",
"_id" : "2",
"_score" : 0.30685282, "_source" : {"model": "T-Shirt", "color":"black", "size":"L", "stock":3, "orders": 9}
}, {
"_index" : "test",
"_type" : "entry",
"_id" : "4",
"_score" : 0.30685282, "_source" : {"model": "T-Shirt", "color":"white", "size":"L", "stock":1, "orders":1}
} ]
}
}
Agréger
$ curl -XPOST http://localhost:9200/test/_search?pretty=true -d '
{
"size": 0,
"aggs": {
"size_stock": {
"terms": {"field":"size"},
"aggs": {
"stock": {
"sum": {"field": "stock"}
},
"orders": {
"sum": {"field": "orders"}
}
}
}
}
}'
{
"took" : 11,
"timed_out" : false,
"_shards" : {
"total" : 5,
"successful" : 5,
"failed" : 0
},
"hits" : {
"total" : 4,
"max_score" : 0.0,
"hits" : [ ]
},
"aggregations" : {
"size_stock" : {
"buckets" : [ {
"key" : "l",
"doc_count" : 2,
"stock" : {
"value" : 4.0
},
"orders" : {
"value" : 10.0
}
}, {
"key" : "s",
"doc_count" : 1,
"stock" : {
"value" : 5.0
},
"orders" : {
"value" : 0.0
}
}, {
"key" : "xl",
"doc_count" : 1,
"stock" : {
"value" : 10.0
},
"orders" : {
"value" : 2.0
}
} ]
}
}
}
C'est un exemple qui aurait nécessité en version 0.90.x deux facettes terms_stats
.
Qui utilise Elasticsearch ?
-
Allociné
-
Mozilla utilise Elasticsearch depuis longtemps et dans de nombreux projets dont :
Et sûrement beaucoup d'autres, si des employés de Mozilla passent par ici.
- Wikimedia : Wikimedia moving to Elasticsearch
Wordpress : Scaling Elasticsearch Part 1: Overview (
All posts tagged ElasticSearch)Et beaucoup d'autres
Une section plus commerciale existe sur le site : Case Studies
Et vous, utilisez-vous Elasticsearch ?
Aller plus loin
- elasticsearch.org (929 clics)
- Télécharger elasticsearch (61 clics)
- Apache Lucene (37 clics)
- Sortie d'Elastic Search en version 0.19 (112 clics)
- Elasticsearch sort en version 0.90 (84 clics)
# Et beaucoup d'autres
Posté par BAud (site web personnel) . Évalué à 8.
bin…
ici-même, cf. :
# et 10 min plus tard ...
Posté par Katyucha (site web personnel) . Évalué à 4.
Mise à jour effectuée ! Vraiment bien ce logiciel !
Flume, elasticsearch, kibana … un trio gagnant !
[^] # Re: et 10 min plus tard ...
Posté par Anonyme . Évalué à 2.
Ici c’est nxlog -> es -> kibana. Marche bien aussi :) Je ne connaissais pas Flume par contre.
# Lien Simple Query String Query KO
Posté par Maxx . Évalué à 1.
Le lien vers la documentation "Simple Query String Query" semble erroné, erreur 404 à l'arrivée.
[^] # Re: Lien Simple Query String Query KO
Posté par Benoît Laurent (site web personnel) . Évalué à 3.
Effectivement, il y a un '&' au lieu de '1' dans l'url, la voici :
http://www.elasticsearch.org/guide/en/elasticsearch/reference/1.x/query-dsl-simple-query-string-query.html
[^] # Re: Lien Simple Query String Query KO
Posté par palm123 (site web personnel) . Évalué à 2.
corrigé, merci.
ウィズコロナ
# solr
Posté par YBoy360 (site web personnel) . Évalué à 3.
Quel est l'avantage par rapport à un bon vieux solr des familles ?
Parce que solr à vraiment evolué depuis la création d'es. Peut être la scalabilité ou le support d'Amazon?
[^] # Re: solr
Posté par hermenegilde . Évalué à 5.
schema dynamique, scalabilité, la percolation, les agrégations, les documents nested ou complexes, le query DSL qui semble faire plus de choses.
[^] # Re: solr
Posté par YBoy360 (site web personnel) . Évalué à 1.
Les agrégations, il me semble que soir le fait et de manière très performante.
Sinon il y a ce lien qui me permet d'avoir une liste de differences :
http://www.ymc.ch/en/why-we-chose-solr-4-0-instead-of-elasticsearch
Mais j'imagine que les choses évoluent vite, et qu'il est difficile de maintenir ce genre de liste a jour
# Indexation de documents
Posté par flan (site web personnel) . Évalué à 1.
je bosse sur un petit site pour stocker mes documentations (notamment celles de langages ou de bibliothèques que j'utilise), et j'aimerais ajouter le support des PDF avec une indexation avec ElasticSearch.
J'ai l'impression que c'est possible ( http://www.elasticsearch.org/guide/en/elasticsearch/reference/current/mapping-attachment-type.html ). Si je comprends bien, j'envoie simplement à ElasticSearch une requête POST qui contient ce message JSON (avec mon PDF en base64), et il sera indexé proprement. Me trompé-je ?
Et si je lui passe une archive ZIP avec plein de HTML dedans, fonctionnera-t-il aussi bien ?
Ça m'enlèverait une bonne épine du pied !
[^] # Re: Indexation de documents
Posté par hermenegilde . Évalué à 1.
ça marche, mais il ne faut pas faire comme cela. L'attachment mapper n'est pas la méthode recommandé:
https://groups.google.com/forum/#!msg/elasticsearch-fr/7zmr6oG58lI/v5DYGE_4r0MJ
[^] # Re: Indexation de documents
Posté par flan (site web personnel) . Évalué à 1.
Ah oui, en effet.
Malheureusement, ça m'a l'air compliqué d'extraire le contenu des PDF en Python 3.3, je risque de passer outre (en partant du principe que je n'aurais pas trop de fichiers), en attendant de trouver une meilleure solution. Merci pour l'info, en tout cas !
[^] # Re: Indexation de documents
Posté par Nonolapéro . Évalué à 2.
Sinon faut demander à Python d'appeler pdftotext et stocker le résultat dans un coin_/.
[^] # Re: Indexation de documents
Posté par flan (site web personnel) . Évalué à 1.
Je n'avais pas spécialement envie d'utiliser un programme externe, à vrai dire. La solution proposée par ElasticSearch me convient tout à fait, même si elle doit consommer un peu plus d'espace disque (mais vu les volumes considérés, ce n'est pas grave).
[^] # Re: Indexation de documents
Posté par steph1978 . Évalué à 2.
Avec un peu de poudre verte oui :)
ES n'indexe que le json que tu lui passe, il n’interprète rien d'autre.
C'est donc à toi de transformer les données dans un format json.
Tu peux ajouter ou extraire des metadata, genre "titre", "date" et le texte brut en le nommant "text" par ex.
Autant du HTML bien structuré, tu devrais pouvoir faire qqch d'assez fin, genre extraire des paragraphe ou qqch dans ce gout.
Autant du PDF, tu sera chanceux si tu récupères les mots dans l'ordre de lecture. Car il est possible de construire des PDF vraiment pas loin du sens du contenu. Il est à rappeler que ce format est destiné à de l'impression et certainement pas à de la gestion documentaire.
Après, si tu veux juste répondre à la question lequel de mes documents contient le mot "elastic", cela devrait le faire.
Il y a aussi de très bon logiciels d'indexation pour ordinateur personnel.
Bon courage.
[^] # Re: Indexation de documents
Posté par flan (site web personnel) . Évalué à 2.
Manifestement, avec tika utilisé par ElasticSearch, ça fonctionne plutôt pas mal :) Et ça permet de prendre en compte autre chose que le pdf (docx, odt, etc.).
Au passage, les systèmes d'indexation ne correspondaient pas à ce que je voulais faire, même si mon ordi en utilise un depuis début 2005 :)
Suivre le flux des commentaires
Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.