Elasticsearch, quelques interrogations


(Mathieu) #1

Bonjour,
j'ai quelques questions sur ElasticSearch à vous poser, je ne parviens pas à trouver de réponses à celles-ci malgré le fait que j'utilise désormais elasticsearch depuis déjà plus de 6 mois et que j'ai déjà sorti un projet en prod grâce à lui; mais que je dois dès maintenant améliorer.

J'espère que vous pourrez m'aider dans ces questionnements :

  • J'ai installé la river CSV. Je comprends mal le principe, à l'installation la river indexe bien toutes les lignes de mes CSV, et ca marche même très bien (4 Million de documents, assez rapidement).
    Ma question : je n'ai pas bien saisi le fonctionnement de la river csv; quand réindexe-t-elle les CSV ? Dès qu'il y a un changement ? Ou dois-t-on la relancer par une commande ? Et dans ce cas-là, laquelle ?

  • Je souhaiterai sur tous les documents que j'ai indexé, générer un champ "tags" qui permette à elasticsearch d'effectuer des recherches par la suite. J'ai bien lu les fonctions de token qui sont très puissantes à l'indexation.
    Ma question : peux-t-on dire à elasticsearch de construire un champ TAG dans lequel il stockerait le résultat de tokens automatiquement ? Par exemple que le champ Title: "vol en hélictoptère au-dessus du bassin d'arcachon" alimente le champ TAG avec les mots-clés : "vol","hélicoptère","bassin d'arcachon".
    Peut-être que ce champ TAG n'est possible qu'à l'indexation des documents, ca ne me dérange pas, mais comment le mettre en oeuvre ?

  • Enfin, comment mettre en oeuvre plusieures instances de ElasticSearch sur un même serveur, et y-a-t-il un intérêt?
    Dans ce cas-là, elasticsearch s'occupe-t-il seul de la synchronisation entre ces différents serveurs, ou est-ce à nous de le faire à chaque changement dans un document ?

Merci du temps que vous voudrez bien m'accorder à répondre à une ou plusieures de ces questions.


(Jérôme Mainaud) #2

Bonjour,

Voici quelques éléments de réponse à tes questions.

  1. Les rivers sont obsolètes et ne permettent pas de garder le contrôle applicatif. Il est par ailleurs très facile d'écrire un programme qui lit un CSV et en index le contenu. C'est plus rapide que le temps passer sur les forums à comprendre le fonctionnement de la rivère. Je te conseille donc de l'écrire. D'une part, c'est un excellent exercice, ensuite, tu maitriseras le cycle de vie des imports. Je n'ai pas la réponse à ta question, car j'ai toujours fuit les rivières pour les raisons ci-dessus, la CSV River, tout comme les SQL, File ou Dick Rivers.

  2. Je n'ai pas bien compris l'intérêt de ton champ TAG. De ce que je comprends, tu veux pourvoir rechercher les documents qui contiennent les mots "vol" ou "hélicoptère" dans le titre. C'est bien là le fonctionnement classique de la recherche documentaire. Il suffit de chercher le mot "vol" sur le champs "title" pour tourver celui qui contient le texte "vol en hélictoptère au-dessus du bassin d'arcachon".
    Ce qui est sur, c'est qu'Elasticsearch ne va pas modifier le document que tu indexes. Il n'ajoutera donc pas de champ TAG. Celui-ci doit être créé par tes soins avant indexation.
    Ce que je pense, c'est que tu n'en as pas besoin car le besoin semble correspondre au fonctionnement standard d'Elasticsearch. Au plus auras-tu besoin d'adapter les analyseurs pour que les termes produits lors de l'indexation soit adaptés aux types de recherche. Eventuellement, tu utiliseras le champ _all ou des champs regroupant les valeurs de plusieurs autres champs avec la propriété copy_to.

  3. Je ne vois aucun intérêt à mettre plusieurs instances d'Elasticsearch sur un même serveur. En fait, il y a un cas très particulier où c'est intéressant, mais il s'agit là d'un usage avancé très différent de ce dont tu parles. Nous seulement cela n'apporte aucune sécurité mais risque de réduire les performances puisque les différentes instances vont se disputer les ressources. En général, on déploie les instances sur des machines différentes.

J'ai répondu de façon un peu détournée, j'espère que ça t'aidera tout de même.
Bon courage.


(Mathieu) #3

Merci de tes réponses. Justement auparavant jetais déjà en parsing + indexation via PHP. Je vais donc rester ainsi sans utiliser se river. Peut-être seulement changer de langage car PHP est peut-être trop lent pour parser 4 million de lignes et les envoyer a es.

Pour ma question sur les tags je cherche à réaliser un moteur de recherche avec autocompletion je croyais qu'il fallait faire ainsi. J'aurai aussi souhaité que ES me suggère des produits similaires.. je vois ça sur plein de site utilisant ES mais je ne comprends pas comment le faire.


(Jérôme Mainaud) #4

Désolé de répondre tardivement.

Personnellement, j'utilise Java et le driver natif pour ce genre de travail, mais tu dois très bien pouvoir faire la même chose avec PHP. Ce qui est important, c'est d'utiliser l'API BULK pour regrouper les écritures par paquets (tu es responsable de constituer les paquets.) Des paquets d'environ 1000 éléments apportent en général une amélioration importante des performances d'indexation.

Il y a plusieurs façon de gérer l'auto-completion, voici quelques pistes.

  1. Une technique simple est d'utiliser une recherche classique avec un analyseur utilisant un filtre edge ngram. Dans ce cas, les suggestions sont des résultats de recherche. C'est similaire à la recherche dans les contacts de Google. La sélection d'une proposition te conduit directement vers la fiche du contact. Ou proche de la recherche en temps réel de Google (la différence n'est qu'une question de présentation des résultats.)

  2. Sinon, tu crées un index spécial d'éléments à suggérer, utilisé avec un filtre edge ngram. Les suggestions sont alors utilisées par ton UI pour construire ta requête. Le comportement est proche de celui des suggestions de Google.

  3. Tu peux aussi regarder le mécanisme de suggestion. L'API est assez compliquée mais peux être un bon substitut du deuxième point car il évite de gérer un index dédié.

Dans l'absolu, je te conseillerais la première solution qui est plus simple et finalement plus pratique pour l'utilisateur dans le cas général. Mais tout dépend de ton cas d'utilisation. Donc choisi la solution qui te conviens le mieux.

N'hésite pas à faire des retours sur la solution que tu as choisie et des difficultés ou facilités que tu as rencontrées. Ça nous servira à tous.


(system) #5