Sortie d'Elasticsearch en version 1.0

31
12
fév.
2014
Base de données

Elasticsearch est un moteur de recherche distribué, RESTful, reposant sur la bibliothèque Apache Lucene et sous licence Apache 2.

logo

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

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

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 ?

Et sûrement beaucoup d'autres, si des employés de Mozilla passent par ici.

Et vous, utilisez-vous Elasticsearch ?

Suivre le flux des commentaires

Note : les commentaires appartiennent à ceux qui les ont postés. Nous n'en sommes pas responsables.