Chapitre 1. Présentation d’Elasticsearch

Ce chapitre couvre :

  • Comprendre les moteurs de recherche et les problèmes qu’ils résolvent
  • Comment Elasticsearch s’intègre dans le contexte des moteurs de recherche
  • Scénarios typiques pour Elasticsearch
  • Fonctionnalités fournies par Elasticsearch
  • Installer Elasticsearch

Nous utilisons la recherche partout de nos jours. Et c’est une bonne chose, car la recherche vous aide à terminer vos tâches beaucoup plus rapidement et facilement. Que vous achetiez quelque chose dans une boutique en ligne ou visitiez un blog, vous vous attendez à disposer d’un champ de recherche quelque part pour vous aider à trouver ce que vous cherchez sans parcourir le site Web en entier. C’est peut-être moi, mais quand je me lève le matin, j’aimerais pouvoir entrer dans la cuisine et taper «bol» dans un champ de recherche quelque part et avoir mon bol préféré mis en évidence.

Nous nous attendons également à ce que ces champs de recherche soient intelligents. Je ne veux pas avoir à taper le mot entier « bol »; je m’attends à ce que le champ de recherche fournisse des suggestions, et je ne veux pas que les résultats et les suggestions me parviennent dans un ordre aléatoire. Je veux que la recherche soit intelligente et me donne d’abord les résultats les plus pertinents – deviner ce que je veux, si cela est possible. Par exemple, si je cherche «ordinateur portable» dans une boutique en ligne mais que je dois faire défiler les accessoires d’ordinateur portable avant d’arriver à un ordinateur portable, il est probable que j’irai ailleurs après la première page de résultats. Et ce besoin de résultats pertinents et de suggestions n’est pas seulement dû au fait que nous sommes pressés et submergées par de bonnes interfaces de recherche; c’est aussi parce qu’il y a de plus en plus de choix. Par exemple, une amie d’enfance que je nommerai ici Mélanie pour l’exemple m’a demandé de l’aider à acheter un nouvel ordinateur portable. Taper «meilleur ordinateur portable pour mon ami» dans le champ de recherche d’un magasin en ligne proposant des milliers d’ordinateurs portables ne serait pas efficace. Une bonne recherche par mot clé ne suffit pas souvent; vous avez besoin de statistiques sur les résultats pour pouvoir les cibler. Ce que je cherchais sur un ordinateur portable, en sélectionnant la taille de l’écran, la fourchette de prix, etc. jusqu’à ce que ai environ cinq. ordinateurs portables à choisir.

Enfin, il y a la question de la performance, car personne ne veut attendre. J’ai vu des sites Web sur lesquels vous recherchez quelque chose et obtenez les résultats en quelques minutes. Minutes! Pour une recherche!

Si vous souhaitez fournir un outil de recherche sur vos données, vous devrez résoudre tous ces problèmes: renvoyer des résultats de recherche pertinents, renvoyer des statistiques et tout faire rapidement. C’est là que les moteurs de recherche comme Elasticsearch entrent en jeu parce qu’ils sont conçus pour relever ces défis. Vous pouvez déployer un moteur de recherche sur une base de données relationnelle pour créer des index et accélérer les requêtes SQL. Vous pouvez également indexer les données de votre magasin de données NoSQL pour y ajouter des fonctionnalités de recherche. Vous pouvez le faire avec Elasticsearch et cela fonctionne bien avec les bases de données orientés documents tels que MongoDB car les données sont également représentées dans Elasticsearch comme des documents. Les moteurs de recherche modernes tels que Elasticsearch enregistrent également vos données de manière à ce que vous puissiez les utiliser en tant que base de données NoSQL dotée de puissantes fonctionnalités de recherche.

Elasticsearch est un outil open-source et distribué. Il repose sur Apache Lucene [1], une bibliothèque de moteur de recherche open source, qui vous permet d’implémenter les fonctionnalités de recherche dans votre propre application Java. Elasticsearch prend cette fonction Lucene et l’étend pour rendre le stockage, l’indexation et la recherche plus rapides, plus faciles et, comme son nom le suggère, élastiques. De plus, votre application n’a pas besoin d’être écrite en Java pour fonctionner avec Elasticsearch; vous pouvez envoyer des données via HTTP au format JSON pour indexer, rechercher et gérer votre cluster Elasticsearch.

1 Vous trouverez plus d’informations sur Apache Lucene à l’adresse http://lucene.apache.org/core/.

Ce chapitre présente ces fonctionnalités de recherche et vous apprendrez à les utiliser tout au long de ce livre. Tout d’abord, examinons de plus près les problèmes auxquels les moteurs de recherche sont généralement confrontés et l’approche d’Elasticsearch pour les résoudre.

1.1. RESOLUTION DE PROBLEMES DE RECHERCHE AVEC ELASTICSEARCH

Pour avoir une meilleure idée du fonctionnement d’Elasticsearch, prenons un exemple. Imaginez que vous travaillez sur un site Web qui héberge des blogs et que vous souhaitez permettre aux utilisateurs de rechercher sur tout le site des publications spécifiques. Votre première tâche consiste à mettre en œuvre la recherche par mot clé. Par exemple, si un utilisateur recherche des « élections », vous feriez mieux de renvoyer tous les messages contenant ce mot.

Un moteur de recherche le fera pour vous, mais pour une fonctionnalité de recherche robuste, vous avez besoin de plus que cela: les résultats doivent être fournis rapidement, et ils doivent être pertinents. Il est également intéressant de proposer des fonctionnalités qui aident les utilisateurs à effectuer des recherches quand ils ne connaissent pas les mots exacts de ce qu’ils recherchent. Ces fonctionnalités incluent la détection de fautes de frappe, la fourniture de suggestions et la décomposition des résultats en catégories.



Dans ce chapitre, vous aurez un aperçu des fonctionnalités d’Elasticsearch. Si vous voulez vous familiariser avec l’installation, passez directement à la section 1.5. La procédure d’installation est étonnamment simple. Et vous pouvez toujours revenir ici pour une vue d’ensemble de haut niveau.



1.1.1. Fournir des recherches rapides

Si vous avez un très grand nombre de publications sur votre site, rechercher le mot « élections » dans toutes ces publications peut prendre beaucoup de temps et vous ne voulez pas que vos utilisateurs attendent. C’est là que Elasticsearch aide car il utilise Lucene, une bibliothèque de moteur de recherche à hautes performances, pour indexer toutes vos données par défaut.

Un index est une structure de données que vous créez avec vos données et qui doit permettre des recherches plus rapides. Vous pouvez ajouter des index aux champs dans la plupart des bases de données, et il existe plusieurs façons de le faire. Lucene le fait avec une indexation inversée, ce qui signifie qu’il crée une structure de données dans laquelle il conserve une liste des endroits auxquels chaque mot appartient. Par exemple, si vous devez rechercher des articles de blog à l’aide de leurs tags, l’utilisation de l’indexation inversée peut ressembler à celle du tableau 1.1.

Si vous recherchez des articles de blog portant un tag « élections », il est beaucoup plus rapide de regarder l’index plutôt que de regarder chaque mot de chaque article de blog, car il vous suffit de regarder l’endroit où le tag est élections, et vous obtenez tous les articles de blog correspondants. Ce gain de vitesse est logique dans le contexte d’un moteur de recherche. Dans le monde réel, vous recherchez rarement un seul mot. Par exemple, si vous recherchez «Elasticsearch en action», la recherche de trois mots implique de multiplier votre gain de vitesse par trois. Tout cela peut sembler un peu complexe à ce stade, mais nous clarifierons les détails lorsque nous aborderons l’indexation au chapitre 3 et la recherche au chapitre 4.

Un index inversé est également approprié pour un moteur de recherche en termes de pertinence. Par exemple, lorsque vous recherchez un mot comme «paix», vous verrez non seulement quel document correspond, mais vous obtenez également le nombre de documents correspondants gratuitement. Ceci est important car si un mot apparaît dans la plupart des documents, il est probablement moins pertinent. Supposons que vous recherchez «Elasticsearch in Action.» Et qu’un document contient le mot «in», ainsi que des millions de documents. À ce stade, vous savez que « in » est un mot courant, et le fait que ce document corresponde ne dit pas grand-chose à quel point il est pertinent pour votre recherche. En revanche, s’il contient «Elasticsearch» avec une centaine d’autres, vous savez que vous vous rapprochez de documents pertinents. Mais ce n’est pas «vous» qui devez savoir que vous vous rapprochez; Elasticsearch le fait pour vous. Vous apprendrez tout sur le réglage des données et la pertinence au chapitre 6.

Cela dit, le meilleur compromis en termes de performances de recherche et de pertinence est que l’index occupe de l’espace disque et que l’ajout de nouveaux articles de blog sera plus lent, car vous devez mettre à jour l’index après avoir ajouté les données. En revanche, le réglage peut rendre Elasticsearch plus rapide, qu’il s’agisse d’indexation ou de recherche. Nous aborderons le réglage en détail au chapitre 10.

1.1.2. Assurer des résultats pertinents

Il y a ensuite la partie difficile: comment faire apparaître les articles de blog concernant les élections avant ceux qui contiennent simplement le mot élection? Avec Elasticsearch, vous disposez de quelques algorithmes pour calculer le score de pertinence, utilisé par défaut pour trier les résultats.

Le score de pertinence est un numéro attribué à chaque document qui correspond à vos critères de recherche et indique dans quelle mesure le document donné est pertinent par rapport aux critères. Par exemple, si un article de blog contient des «élections» plus de fois qu’un autre, il est plus probable qu’il soit question d’élections. La figure 1.1 montre un exemple de DuckDuckGo.

Par défaut, l’algorithme utilisé pour calculer le score de pertinence d’un document est TF-IDF. Nous discuterons plus en détail du scoring et de la notion TF-IDF aux chapitres 4 et 6, consacrés à la recherche et à la pertinence, mais voici l’idée de base: TF-IDF désigne la fréquence des termes et celle inverse dans un document, qui sont les deux facteurs qui influencent le score de pertinence. .

  • Fréquence terminologique – Plus le nombre de mots que vous recherchez apparaît dans un document, plus le score est élevé.
  • Fréquence inverse dans un document— Le poids de chaque mot est plus élevé si le mot est inhabituel dans d’autres documents.
    Par exemple, si vous recherchez «course à vélo» sur le blog d’un cycliste, le mot «vélo» compte beaucoup moins pour le score que «course». Mais plus les deux mots apparaissent plusieurs fois dans un document, plus le score de ce document est élevé.

En plus de choisir un algorithme, Elasticsearch fournit de nombreuses autres fonctionnalités intégrées pour influencer le score de pertinence en fonction de vos besoins. Par exemple, vous pouvez «booster» le score d’un champ particulier, tel que le titre d’un message, pour qu’il soit plus important que le corps. Cela donne des scores plus élevés aux documents correspondant à vos critères de recherche dans le titre, par rapport aux documents similaires ne correspondant qu’au corps. Vous pouvez faire en sorte que les correspondances exactes comptent plus que les correspondances partielles et vous pouvez même utiliser un script pour ajouter des critères personnalisés au calcul du score. Par exemple, si vous autorisez les utilisateurs à aimer les publications, vous pouvez augmenter le score en fonction du nombre de mentions j’aime ou vous pouvez faire en sorte que les nouvelles publications aient des scores plus élevés que les précédentes.

Ne vous inquiétez pas de la mécanique de ces fonctionnalités pour le moment; Le chapitre 6 traite en détail de la pertinence. Pour l’instant, concentrons-nous sur ce que vous pouvez faire avec Elasticsearch et sur le moment où vous souhaiteriez utiliser ces fonctionnalités.

1.1.3. Rechercher au-delà des correspondances exactes

Avec Elasticsearch, vous devez rendre vos recherches intuitives et aller au-delà des informations saisies par l’utilisateur. Ces options sont pratiques lorsque l’utilisateur entre une faute de frappe ou utilise un synonyme ou un mot différent de celui que vous avez enregistré. Ils sont également utiles lorsque l’utilisateur ne sait pas exactement quoi rechercher en premier lieu.

  • Traitement des fautes de frappe

Vous pouvez configurer Elasticsearch pour qu’il soit tolérant aux variations au lieu de rechercher des correspondances exactes. Une requête floue peut être utilisée. En effet une bicyclette correspondra à un article de blog sur les vélos. Nous explorerons les requêtes floues et d’autres fonctionnalités qui peuvent rendre vos recherches pertinentes dans le chapitre 6.

  • Gérer les termes dérivés

Vous pouvez également utiliser l’analyse, abordée au chapitre 5, pour faire comprendre à Elasticsearch qu’un blog dont le titre est «vélo» doit également correspondre aux requêtes mentionnant «cycliste» ou «cyclisme». Vous avez probablement remarqué que, dans la figure 1.1, «élections  » correspondait aussi au mot  » élection  » au singulier. Vous avez peut-être aussi remarqué que les termes correspondants sont en gras. Elasticsearch peut également le faire.Nous aborderons la mise en évidence à l’annexe C.

  • Utilisation de statistiques

Lorsque les utilisateurs ne savent pas quoi rechercher, vous pouvez les aider de différentes manières. L’une des méthodes consiste à présenter des statistiques sous forme d’agrégations (voir le chapitre 7). Les agrégations permettent d’obtenir des compteurs à partir des résultats de votre requête, par exemple le nombre de sujets relevant de chaque catégorie ou le nombre moyen de likes et de partages associés à chacune d’elles. Imaginez qu’en entrant dans votre blog, les utilisateurs voient les sujets populaires énumérés à droite. Un sujet peut être le cyclisme. Les personnes intéressées par le cyclisme cliqueraient sur ce sujet pour affiner les résultats. Ensuite, vous pouvez avoir une autre agrégation pour séparer les messages de cyclisme en «revues de vélo», «événements cyclistes», etc.

  • Fournir des suggestions

Une fois que les utilisateurs commencent à taper, vous pouvez les aider à découvrir les recherches et les résultats courants. Vous pouvez utiliser les suggestions pour prédire leurs recherches au fur et à mesure de leur frappe, comme le font la plupart des moteurs de recherche sur le Web. Vous pouvez également afficher les résultats courants au fur et à mesure de leur saisie, à l’aide de types de requête spéciales qui correspondent aux préfixes, aux caractères génériques ou aux expressions régulières. Dans l’annexe F, nous aborderons également les suggestions, qui sont des requêtes plus rapides que la normale pour les fonctionnalités de saisie semi-automatique et automatique.

Maintenant que nous avons discuté des fonctionnalités de haut niveau fournies par Elasticsearch, voyons comment ces fonctionnalités sont généralement utilisées en production.

1.2. EXPLORATION DE CAS D’UTILISATION D’ÉLASTICSEARCH

Nous avons déjà établi que le stockage et l’indexation de vos données dans Elasticsearch constituent un bon moyen de fournir des résultats rapides et pertinents pour vos recherches. Mais au final, Elasticsearch n’est qu’un moteur de recherche, et vous ne l’utiliserez jamais seul. Comme tout autre magasin de données, vous avez besoin d’un moyen de fournir des données et vous devez probablement fournir une interface aux utilisateurs qui recherchent ces données.

Pour avoir une idée de la manière dont Elasticsearch pourrait s’intégrer dans un système plus grand, examinons trois scénarios types:

  • Elasticsearch, principal serveur de votre site Web: comme nous en avons discuté, vous pouvez créer un site Web permettant aux utilisateurs d’écrire des articles de blog, mais vous souhaitez également pouvoir effectuer une recherche dans les articles. Vous pouvez utiliser Elasticsearch pour stocker toutes les données liées à ces publications et répondre aux requêtes.
  • Ajout d’Elasticsearch à un système existant – Vous lisez peut-être ce livre car vous avez déjà un système qui traite des données et vous souhaitez ajouter une recherche. Nous allons examiner quelques conceptions globales pour savoir comment procéder.
  • Elasticsearch est la solution finale d’une solution clé en main construite autour d’elle – Elasticsearch étant un logiciel Open source offrant une interface HTTP simple, un vaste écosystème le prend en charge. Par exemple, Elasticsearch est populaire pour la centralisation des logs. Compte tenu des outils déjà disponibles qui permettent d’écrire et de lire à partir d’Elasticsearch, outre la configuration de ces outils pour qu’ils fonctionnent comme vous le souhaitez, vous n’avez rien à développer.

Examinons de plus près chacun de ces scénarios.

1.2.1. Utiliser Elasticsearch comme back-end principal

Traditionnellement, les moteurs de recherche sont déployés au-dessus d’une base de données bien établis pour fournir une capacité de recherche rapide et pertinente. C’est parce que les moteurs de recherche n’offraient pas de stockage durable ni d’autres fonctionnalités souvent nécessaires, telles que les statistiques.

Elasticsearch fait partie de ces moteurs de recherche modernes qui fournissent un stockage durable, des statistiques et de nombreuses autres fonctionnalités auxquelles vous vous attendez lorsque vous travaillez avec une base de données. Si vous démarrez un nouveau projet, nous vous recommandons d’envisager d’utiliser Elasticsearch comme seule base de données pour vous aider à garder votre conception aussi simple que possible. Cela peut ne pas fonctionner correctement pour tous les cas d’utilisation (par exemple, lorsque vous avez beaucoup de mises à jour), vous pouvez donc également utiliser Elasticsearch conjointement à une autre base de données.



Comme les autres bases de données NoSQL, Elasticsearch ne prend pas en charge les transactions. Au chapitre 3, vous verrez comment utiliser le versionning pour gérer les accès simultanés. Toutefois, si vous avez besoin de transactions, envisagez d’utiliser une autre base de données en parallèle. De plus, des sauvegardes régulières sont une bonne pratique lorsque vous utilisez une seule base de données. Nous aborderons les sauvegardes au chapitre 11.



Revenons à l’exemple de blog: vous pouvez stocker des articles de blog récemment écrits dans Elasticsearch. De même, vous pouvez utiliser Elasticsearch pour extraire, rechercher ou créer des statistiques dans toutes ces données, comme illustré à la figure 1.2.

Que se passe-t-il si un serveur tombe en panne? Vous pouvez obtenir une tolérance aux pannes en répliquant vos données sur différents serveurs. De nombreuses autres fonctionnalités font d’Elasticsearch une base de données NoSQL séduisante. Cela ne peut pas être génial pour tout, mais vous devez vous demander si l’inclusion d’une autre base de données dans votre conception est bénéfique malgré la complexité supplémentaire.

1.2.2. Ajouter Elasticsearch à un système existant

En soi, Elasticsearch peut ne pas toujours fournir toutes les fonctionnalités dont vous avez besoin d’une base de données. Certaines situations peuvent vous obliger à utiliser Elasticsearch en plus d’une autre base de données.

Par exemple, la prise en charge des transactions et les relations complexes sont des fonctionnalités non prises en charge par ElasticSearch, du moins dans la version 1. Si vous avez besoin de ces fonctionnalités, envisagez d’utiliser Elasticsearch avec une autre base de données.

Ou vous avez peut-être déjà un système complexe qui fonctionne, mais vous souhaitez ajouter une recherche. Il peut être risqué de revoir l’ensemble du système dans le seul but d’utiliser Elasticsearch seul (bien que vous souhaitiez le faire avec le temps). L’approche la plus sûre consiste à ajouter Elasticsearch à votre système et à le faire fonctionner avec vos composants existants.

De toute façon, si vous avez deux base de données, vous devrez trouver un moyen de les synchroniser. En fonction de votre base de données principale et de la disposition de vos données, vous pouvez déployer un plug-in Elasticsearch pour maintenir les deux entités synchronisées, comme illustré à la figure 1.3.

Par exemple, supposons que vous ayez un magasin de e-commerce en ligne avec des informations sur le produit stockées dans une base de données SQL. Vous avez besoin d’une recherche rapide et pertinente, vous devez donc installer Elasticsearch. Pour indexer les données, vous devez déployer un mécanisme de synchronisation, qui peut être un plug-in Elasticsearch ou un service personnalisé que vous créez. Vous en apprendrez plus sur les plugins en Annexe B et sur le traitement de l’indexation et de la mise à jour à partir de votre propre application au chapitre 3. Ce mécanisme de synchronisation pourrait extraire toutes les données correspondant à chaque produit et les indexer dans Elasticsearch, où chaque produit est stocké sous forme de  document.

Lorsqu’un utilisateur tape des critères de recherche sur la page Web, l’application Web en vitrine interroge Elasticsearch sur ce critère. Elasticsearch renvoie un certain nombre de documents produit correspondant aux critères, triés selon vos préférences. Le tri peut être basé sur un score de pertinence qui indique combien de fois les mots recherchés apparaissent dans chaque produit, ou quoi que ce soit stocké dans le document correspondant, tel que la date à laquelle le produit a été ajouté, la note moyenne ou même une combinaison de celles-ci.

L’insertion ou la mise à jour des informations peut toujours être effectuée sur la base de données SQL «primaire». Vous pouvez donc utiliser Elasticsearch uniquement pour gérer les recherches. C’est au mécanisme de synchronisation de tenir Elasticsearch au courant des dernières modifications.

Lorsque vous devez intégrer Elasticsearch à d’autres composants, vous pouvez rechercher les outils existants qui font peut-être déjà ce dont vous avez besoin. Comme nous le verrons dans la section suivante, il existe de puissantes communautés pour Elasticsearch, et il n’est parfois pas nécessaire de créer un composant personnalisé.

1.2.3. Utiliser Elasticsearch avec des outils existants

Dans certains cas d’utilisation, il n’est pas nécessaire d’écrire une seule ligne de code pour effectuer un travail avec Elasticsearch. De nombreux outils fonctionnant avec Elasticsearch sont disponibles, vous n’avez donc pas à écrire le vôtre à partir de zéro.

Par exemple, supposons que vous souhaitiez déployer une infrastructure de journalisation de logs à grande échelle pour stocker, rechercher et analyser un grand nombre d’événements. Comme le montre la figure 1.4, pour traiter les logs générés et envoyés vers Elasticsearch, vous pouvez utiliser des outils de journalisation tels que Rsyslog (www.rsyslog.com), Logstash [2] (www.elastic.co/products/logstash) ou Apache Flume ( http://flume.apache.org). Pour rechercher et analyser ces logs dans une interface visuelle, vous pouvez utiliser Kibana (www.elastic.co/products/kibana).

Le fait que Elasticsearch soit open-source – sous licence Apache 2, pour être précis – n’est pas la seule raison pour laquelle tant d’outils le prennent en charge. Même si Elasticsearch est écrit en Java, il existe plus d’une API Java qui vous permet de travailler avec. Il expose également une API REST, à laquelle toute application peut accéder, quel que soit le langage de programmation dans lequel elle a été écrite.

De plus, les demandes et les réponses REST sont généralement au format JSON (JavaScript Object Notation). En règle générale, une requête REST a sa charge utile en JSON et les réponses sont également un document JSON.



JSON et YAML

JSON est un format d’expression de structures de données. Un objet JSON contient généralement des clés et des valeurs, les valeurs pouvant être des chaînes, des nombres, true / false, null, un autre objet ou un tableau. Pour plus de détails sur le format JSON, visitez http://json.org/.

JSON est facile à analyser et à générer pour les applications. YAML (YAML Ain’t Markup Language) est également pris en charge dans le même but. Pour activer YAML, ajoutez le paramètre format = yaml à la requête HTTP. Pour plus de détails sur YAML, visitez http://yaml.org. Bien que JSON soit généralement utilisé pour la communication HTTP, les fichiers de configuration sont généralement écrits en YAML. Dans ce livre, nous nous en tenons aux formats populaires: JSON pour la communication HTTP et YAML pour la configuration.



Par exemple, une log d’évenement peut ressembler à ceci lorsque vous l’indexez dans Elasticsearch:



Tout au long de ce livre, les noms de champs JSON apparaissent en bleu et leurs valeurs en rouge pour faciliter la lecture du code.



Une recherche dans les logs, avec une valeur « first » dans le champ « message » ressemblerait à ceci:

L’envoi de données et l’exécution de requêtes en envoyant des objets JSON via HTTP facilitent l’extension de tout et n’importe quoi, d’un daémon syslog tel que Rsyslog à une infrastructure de connexion telle qu’Apache ManifoldCF (http://manifoldcf.apache.org) pour interagir avec Elasticsearch. Si vous créez une nouvelle application à partir de rien ou souhaitez ajouter une fonction de recherche à une application existante, l’API REST est l’une des fonctionnalités qui font l’attrait d’Elasticsearch. Dans la section suivante, nous examinerons d’autres fonctionnalités de ce type.

1.2.4. Principales fonctionnalités d’Elasticsearch

Elasticsearch vous permet d’accéder facilement aux fonctionnalités de Lucene pour l’indexation et la recherche de vos données. En ce qui concerne l’indexation, vous disposez de nombreuses options pour traiter le texte et le stocker. Lors de la recherche, vous avez le choix entre plusieurs requêtes et filtres. Elasticsearch expose cette fonctionnalité via l’API REST, ce qui vous permet de structurer les requêtes en JSON et d’ajuster la plupart de la configuration via la même API.

En plus de ce que Lucene fournit, Elasticsearch ajoute sa propre fonctionnalité de haut niveau, de la mise en cache à l’analyse en temps réel. Au chapitre 7, vous apprendrez à effectuer ces analyses grâce à des agrégations, qui peuvent vous donner des résultats tels que les balises de blog les plus populaires, la popularité moyenne d’un certain groupe de publications et d’innombrables combinaisons, telles que la popularité moyenne des publications pour chaque balise.

Un autre niveau d’abstraction est la manière dont vous pouvez organiser les documents: vous pouvez rechercher plusieurs index séparément ou ensemble et vous pouvez placer différents types de documents dans chaque index.

Enfin, Elasticsearch est, comme son nom l’indique, élastique. Il est mis en cluster par défaut – il est considéré ainsi même si vous l’exécutez sur un seul serveur – et vous pouvez toujours ajouter plusieurs serveurs pour augmenter la capacité ou la tolérance aux pannes. De même, vous pouvez facilement supprimer des serveurs du cluster pour réduire les coûts si la charge est faible.

Nous aborderons toutes ces fonctionnalités en détail dans le reste du livre – la mise à l’échelle, en particulier, au chapitre 9 -, mais avant cela, examinons de plus près et voyons en quoi ces fonctionnalités sont utiles.

1.2.5. Extension des fonctionnalités de Lucene

Dans de nombreux cas d’utilisation, les utilisateurs effectuent une recherche en fonction de plusieurs critères. Par exemple, vous pouvez rechercher plusieurs mots dans plusieurs champs. certains critères seraient obligatoires et d’autres facultatifs. L’une des fonctionnalités les plus appréciées d’Elasticsearch est son API REST bien structurée: vous pouvez structurer vos requêtes en JSON de manière à combiner différents types de requêtes de plusieurs manières. Nous allons vous montrer comment au chapitre 4 et vous verrez également comment vous pouvez utiliser des filtres pour inclure ou exclure des résultats de manière peu coûteuse et à travers une mise en cache. Votre recherche JSON peut inclure à la fois des requêtes et des filtres, ainsi que des agrégations, qui génèrent des statistiques à partir de documents correspondants.

Grâce à la même API REST, vous pouvez lire et modifier de nombreux paramètres (comme vous le verrez au chapitre 11), ainsi que la façon dont les documents sont indexés.



Qu’en est-il d’Apache Solr?

Si vous avez déjà entendu parler de Lucene, vous avez probablement aussi entendu parler de Solr, un moteur de recherche distribué à open source basé sur Lucene. En fait, Lucene et Solr ont fusionné en un seul projet Apache en 2010, alors vous pouvez vous demander comment Elasticsearch se distingue de Solr.

Les deux moteurs de recherche offrent des fonctionnalités similaires et les fonctionnalités évoluent rapidement avec chaque nouvelle version. Vous pouvez rechercher des comparaisons sur le Web, mais nous vous recommandons de les prendre avec un grain de sel. En plus d’être liées à des versions particulières, ce qui rend de telles comparaisons obsolètes en quelques mois, beaucoup d’entre elles sont biaisées pour diverses raisons.

Cela dit, quelques faits historiques aident à expliquer les origines des deux produits. Solr a été créée en 2004 et Elasticsearch en 2010. Lorsque Elasticsearch est apparu, son modèle distribué, présenté plus loin dans ce chapitre, simplifiait considérablement son évolution par rapport à n’importe lequel de ses concurrents, d’ou la partie «élastic» du nom. Dans le même temps, cependant, Solr a ajouté le sharding avec la version 4.0, ce qui rend l’argument «distribué» discutable, comme beaucoup d’autres aspects.

Au moment de la rédaction de ce document, Elasticsearch et Solr ont chacun des fonctionnalités que l’autre n’a pas, et choisir entre elles peut résulter des fonctionnalités spécifiques dont vous avez besoin à un moment donné. Dans de nombreux cas d’utilisation, les fonctionnalités dont vous avez besoin sont couvertes par les deux, et, comme c’est souvent le cas chez les concurrents, choisir entre eux devient une question de goût. Si vous souhaitez en savoir plus sur Solr, je vous recommande Solr in Action de Trey Grainger et Timothy Potter (Manning, 2014).



En ce qui concerne la manière dont les documents sont indexés, l’un des aspects importants est l’analyse. Grâce à l’analyse, les mots du texte que vous indexez deviennent des termes dans Elasticsearch. Par exemple, si vous indexez le texte «course de vélo», l’analyse peut produire les termes «vélo», «course», «cyclisme» et «course». Lorsque vous recherchez l’un de ces termes, le document correspondant est inclus. dans les résultats. Le même processus d’analyse s’applique lorsque vous effectuez une recherche, comme illustré à la figure 1.5. Si vous entrez «course cycliste», vous ne voudrez probablement pas rechercher uniquement la correspondance exacte. Peut-être qu’un document contenant ces deux mots quelque part ferait tout autant l’affaire.

L’analyseur par défaut divise d’abord le texte en mots en recherchant des séparateurs de mots courants, tels qu’un espace ou une virgule. Ensuite, il transforme les mots en minuscules, de sorte que «Course de vélos» génère «vélo» et «course». Il existe de nombreux autres analyseurs et vous pouvez également créer le vôtre. Nous allons vous montrer comment au chapitre 5.

À ce stade, vous voudrez peut-être en savoir plus sur le contenu de la zone «indexed data» illustrée à la figure 1.5, car elle semble assez vague. Comme nous en discuterons ensuite, les données sont organisées dans des documents. Par défaut, Elasticsearch stocke vos documents tels quels, et il place également tous les termes résultant de l’analyse dans l’index inversé pour permettre les recherches importantes et rapides. Le chapitre 3 décrit plus en détail l’indexation et le stockage des données. Pour l’instant, examinons de plus près les raisons pour lesquelles Elasticsearch est orienté document et comment il regroupe les documents en types et en index.

1.2.6. Structurer vos données dans Elasticsearch

Contrairement à une base de données relationnelle, qui stocke des données dans des enregistrements ou des lignes, Elasticsearch stocke des données dans des documents. Pourtant, dans une certaine mesure, les deux concepts sont similaires. Avec des lignes dans une table, vous avez des colonnes et pour chaque colonne, chaque ligne a une valeur. Avec un document, vous avez des clés et des valeurs, de la même manière.

La différence est qu’un document est plus flexible qu’une ligne, principalement parce que, dans Elasticsearch au moins, un document peut être hiérarchique. Par exemple, de la même manière que vous associez une clé à une valeur de chaîne, telle que « author »: « Joe », un document peut avoir un tableau de chaînes, tel que « tags »: [« cycle », « bicycles »] , ou même des paires clé-valeur, telles que « auteur »: {« prénom_nom »: « Joe », « nom_dernier »: « Smith »}. Cette flexibilité est importante car elle vous encourage à conserver toutes les données appartenant à une entité logique dans le même document, au lieu de les conserver dans des lignes différentes dans des tables différentes. Par exemple, le moyen le plus simple (et probablement le plus rapide) de stocker des articles de blog est de conserver toutes les données appartenant à une publication dans le même document. De cette façon, les recherches sont rapides car vous n’avez pas besoin de jointures ni de tout autre travail relationnel.

Si vous avez un arrière-plan SQL, vous n’aurez probablement plus la possibilité d’utiliser des jointures. Malheureusement, ils ne sont pas pris en charge, du moins dans la version 1.76 installée.

1.2.7. Installation de Java

Si vous n’avez pas encore d’environnement JRE (Java Runtime Environment), vous devez l’installer au préalable. Toute JRE devrait fonctionner, à condition que ce soit la version 1.7 ou ultérieure. En règle générale, vous installez celui-ci à partir d’Oracle (www.java.com/en/download/index.jsp) ou de l’implémentation à source ouverte, OpenJDK (http://download.java.net/openjdk/).



Dépannage des erreurs «pas de Java trouvé»

Avec Elasticsearch, comme avec d’autres applications Java, il peut arriver que vous ayez téléchargé et installé Java, mais que l’application refuse de démarrer en se plaignant de ne pas pouvoir trouver Java.

Le script d’Elasticsearch recherche Java à deux endroits: la variable d’environnement JAVA_HOME et le chemin système. Pour vérifier s’il s’agit de JAVA_HOME, utilisez la commande env sur les systèmes de type UNIX et la commande set sur Windows. Pour vérifier s’il se trouve dans le chemin système, exécutez la commande suivante:% java -version.

Si cela fonctionne, alors Java est dans votre chemin. Si ce n’est pas le cas, configurez JAVA_HOME ou ajoutez le fichier binaire Java à votre chemin. Le binaire Java se trouve généralement partout où vous avez installé Java (qui devrait être JAVA_HOME), dans le répertoire bin.



1.2.8. Télécharger et démarrer Elasticsearch

Avec Java installé, vous devez installer Elasticsearch et le démarrer. Téléchargez le package qui correspond le mieux à votre environnement. Les options de package suivantes sont disponibles sur www.elastic.co/downloads/elasticsearch: Tar, ZIP, RPM et DEB(Tout système d’exploitation de type UNIX).
Si vous utilisez Linux, Mac ou tout autre système d’exploitation de type UNIX, vous pouvez installer Elasticsearch à partir du paquetage tar.gz. Ensuite, vous pouvez le décompresser et lancer Elasticsearch avec le script shell de l’archive:

Si vous avez besoin d’un moyen plus simple d’installer Elasticsearch sur votre Mac, vous pouvez installer Homebrew. Les instructions pour le faire peuvent être trouvées à http://brew.sh. Avec Homebrew installé, obtenir Elasticsearch consiste à exécuter la commande suivante:

Ensuite, vous le démarrez de la même manière que l’archive tar.gz:

Si vous utilisez Windows, téléchargez l’archive ZIP. Décompressez-le, puis exécutez elasticsearch.bat à partir du répertoire bin /, de la même manière que vous exécutez Elasticsearch sous UNIX:

Si vous utilisez Red Hat Linux, CentOS, SUSE ou tout autre outil fonctionnant avec des RPM, ou Debian, Ubuntu ou tout autre élément fonctionnant avec des DEB, Elastic fournit des référentiels RPM et DEB. Vous pouvez voir comment les utiliser à l’adresse www.elastic.co/guide/fr/elasticsearch/reference/current/setup-repositories.html.

Une fois Elasticsearch installé, ce qui nécessite l’ajout du référentiel à votre liste et l’exécution d’une commande d’installation, vous pouvez le démarrer en exécutant:

Si vous voulez voir ce que fait Elasticsearch, recherchez les logs dans / var / log / elasticsearch /. Si vous l’avez installé en décompressant l’archive TAR ou ZIP, vous devriez les trouver dans le répertoire logs / de l’archive décompressée.

1.2.9. Vérifier que cela fonctionne

Maintenant que vous avez installé et démarré Elasticsearch, examinons les logs générés lors du démarrage et connectez-vous à l’API REST pour la première fois.

Examiner les logs de démarrage
Lorsque vous exécutez Elasticsearch pour la première fois, vous voyez une série de lignes de logs vous indiquant ce qui se passe. Voyons quelques-unes de ces lignes et leur signification.

La première ligne fournit généralement des statistiques sur le nœud que vous avez démarré:

Par défaut, Elasticsearch attribue à votre nœud un nom aléatoire, dans ce cas Karkas, que vous pouvez modifier à partir de la configuration. Vous pouvez voir des détails sur la version particulière d’Elasticsearch que vous exécutez, ainsi que le PID du processus Java qui a démarré.

Les plugins sont chargés lors de l’initialisation et aucun plugin n’est inclus par défaut:

Pour plus d’informations sur les plugins, reportez-vous à l’annexe B.

Le port 9300 est utilisé par défaut pour la communication inter-nœud, appelé transport:

Si vous utilisez l’API Java native au lieu de l’API REST, vous devez vous connecter à ce moment-là.

Dans la ligne suivante, un nœud maître a été choisi et c’est le nœud que vous avez démarré, appelé Karkas:

Nous discuterons de l’élection du noeud principale au chapitre 9, qui traite du scaling. L’idée de base est que chaque cluster a un nœud maître, chargé de savoir quels nœuds sont dans le cluster et où se trouvent tous les fragments. Chaque fois que le maître est indisponible, un nouveau est élu. Dans ce cas, vous avez démarré le premier nœud du cluster. Il s’agit donc de votre maître.

Le port 9200 est utilisé par défaut pour les communications HTTP. C’est ici que les applications utilisant l’API REST se connectent:

La ligne suivante indique que votre noeud est maintenant démarré:

À ce stade, vous pouvez vous y connecter et commencer à émettre des demandes.

La passerelle est le composant d’Elasticsearch qui est responsable de la persistance de vos données sur disque afin que vous ne les perdiez pas si le nœud tombe en panne:

Lorsque vous démarrez votre nœud, la passerelle examine sur le disque pour voir si des données sont enregistrées afin de pouvoir les restaurer. Dans ce cas, il n’ya pas d’index à restaurer.

Une grande partie des informations que nous avons examinées dans ces lignes de journal, du nom du nœud aux paramètres de la passerelle, sont configurables. Nous discutons des options de configuration et des concepts qui les entourent au fur et à mesure de la progression du livre. Vous pouvez vous attendre à ce que de telles options de configuration apparaissent dans la partie 2, consacrée aux performances et à l’administration. Jusque-là, vous n’aurez pas besoin de configurer beaucoup, car les valeurs par défaut conviennent à la plupart des  développeurs.



Les valeurs par défaut sont si conviviales pour les développeurs que si vous démarrez une autre instance Elasticsearch sur un autre ordinateur appartenant au même réseau multidiffusion, celle-ci rejoindra le même cluster que la première instance, ce qui pourrait entraîner des résultats inattendus, tels que la migration de fragments d’un à l’autre. Pour éviter cela, vous pouvez modifier le nom du cluster dans le fichier de configuration elasticsearch.yml, comme indiqué au chapitre 2, section 2.5.1.



Utilisation de l’API REST
Le moyen le plus simple de se connecter à l’API REST consiste à pointer votre navigateur sur http: // localhost: 9200. Si vous n’avez pas installé Elasticsearch sur votre ordinateur local, remplacez localhost par l’adresse IP de l’ordinateur distant. Par défaut, Elasticsearch écoute les requêtes HTTP entrantes sur le port 9200 de toutes les interfaces. Si la demande fonctionne, vous devriez obtenir la réponse JSON adéquate, comme indiqué à la figure 1.6.

1.3. RÉSUMÉ

Maintenant que vous avez tous installé l’outil, examinons ce que nous avons exploré dans ce chapitre:

  • Elasticsearch est un moteur de recherche distribué open-source basé sur Apache Lucene.
  • Le cas d’utilisation typique d’Elasticsearch consiste à indexer de grandes quantités de données afin que vous puissiez exécuter des recherches de texte intégral et des statistiques en temps réel.
  • Elasticsearch fournit des fonctionnalités qui vont bien au-delà de la recherche de texte intégral; Par exemple, vous pouvez ajuster la pertinence de vos recherches et proposer des suggestions de recherche.
  • Pour commencer, téléchargez le package, décompressez-le si nécessaire et exécutez le script de démarrage Elasticsearch.
  • Pour indexer et rechercher des données, ainsi que pour gérer les paramètres de votre cluster, utilisez l’API JSON sur HTTP et récupérez une réponse JSON.
  • Vous pouvez également considérer Elasticsearch comme un magasin de données NoSQL doté de fonctionnalités de recherche et d’analyse en temps réel. Il est orienté document et évolutif par défaut.
  • Elasticsearch divise automatiquement les données en fragments, qui sont équilibrés entre les serveurs disponibles dans votre cluster. Cela facilite l’ajout et la suppression de serveurs à la volée. Les fragments sont également répliqués, ce qui rend votre cluster tolérant aux pannes

Au chapitre 2, vous découvrerez Elasticsearch encore mieux en indexant et recherchant des données réelles.