Little hardware, Big data 3/5

Après le Crawler et l'Analyser, voici la troisième partie de la série "Little hardware, Big data". Ce dossier porte sur un projet de moteur de recherche chronologique. Une version du projet est disponible en ligne sur http://histoires.xyz. Le site fonctionne sur un Raspberry Pi 2, le déploiement contient 13.293.159 documents et tourne à merveille :). Cet article présente les détails du troisième composant : l'API. Ce dernier, qui est un programme Java/Spring Boot, a pour objectif de mettre en place des services REST avec les fonctions de recherche, de statistiques, de synonymie, etc. indispensables au fonctionnement du site.

Les services fournis par l'API

Fonctions principales

La fonction principale du moteur de recherche est... la fonction de recherche. Elle se présente ainsi:

Extrait de code du Controller du service Recherche du site Histoires.xyz

C'est la description du point d'entrée, pour faire une recherche sur ce service il faut faire:

GET http://histoires.xyz/api/phrases?request=feu

Attardons-nous sur la syntaxe de la valeur du paramètre request:

Si je tape...                                   Je veux les phrases qui...

feu                                           ... contiennent "feu"

feu lave                                   ... contiennent "feu" ou "lave"

feu+lave                                  ...contiennent "feu" et "lave"

invent*                                     ...contiennent un terme commençant par "invent"

@1950 invention                   ...sont datées en 1950 et avec "invention"

@-1m feu lave                        ...sont datées d'environ 1 million d'années et avec "feu" ou "lave"

@-2M @-6M bactérie           ...sont datées entre -6 et -2 MA, et avec bactérie

@-4m+-20%                           ...sont datées de -4 million d'années, à + ou - 20% près

Pour mettre en œuvre cela, quelques expressions régulières permettent de distinguer les mots clés et la structure de la recherche. Ce travail est fait par cette classe. Ensuite la requête "parsée" est transformée en requête Lucène prête à être exécutée auprès de notre index Lucène (index construit dans la partie 2). Le code de création des requêtes Lucène est visible ici.

Mais aussi...

Il existe deux autres services:

  • Le service Synonymes permet de proposer des synonymes en cas de recherche infructueuse. Ce service se base sur une proposition de l'université de Caen: www.crisco.unicaen.fr
  • Le service OneRandom qui renvoie à partir d'une requête sur histoires.xyz, un résultat de recherche au hasard parmi tous les résultats. Ce dernier est utilisé en tant que webhook Slack pour proposer un service analogue à celui du /giffy ou /gif mais en sortant une phrase d'encyclopédie au lieu d'une animation GIF.

Les entrants de l'API

Les entrants de l'API correspondent à la sortie générée par l'étape d'analyse présentée dans l'article précédent. Nous avons une collection de documents Lucène, ayant la structure suivante :

  • Méta-donnée : l'auteur, la date d'écriture du texte, le titre/sous-titre, l'url de renvoi vers la source
  • Contenu de document : le texte à proprement parler

Zooms sur quelques détails

L'API est un programme Java Spring Boot. On utilise également la librairie Apache Lucène Core pour exploiter l'index Lucène. Il est à noter que Lucène a un peu tendance à évoluer de manière non rétro-compatible. La surcouche elastic-search par exemple permet de ne pas s'en soucier, cependant on n'est plus sur la même API.

Dans un projet conséquent (ce qui n'est pas le cas ici), avec beaucoup d'évolutions, de règles, de développeurs, etc. ainsi qu'un déploiement sur de "vrais" serveurs plutôt qu'un Raspberry pi,  il vaut mieux partir sur elastic-search.

Cependant, pour une exécution légère et rapide, utiliser Apache Lucène Core est idéal.

Conclusion

Nous venons de jeter un œil à l'API Java/Spring/Rest/Lucene du moteur de recherche http://histoires.xyz qui tourne sur un Raspberry Pi2. En utilisant ces librairies, on peut facilement fabriquer un moteur de recherche sur des documents constitués soi-même. Ici, il s'agit de collecter les phrases de Wikipédia qui contiennent des dates pour les restituer par ordre chronologique, selon un filtrage par date et/ou un filtrage par termes.

Voici un récapitulatif des articles existants et de ceux à venir: partie 1 Crawler , partie 2 Analyser, partie 3 API (cet article), partie 4 l'appli web (à venir), partie 5 la MEP (à venir).

Dans la prochaine partie j'évoquerais l'application Web JS qui consomme les services présentés dans cet article.

Laisser un commentaire

Votre adresse de messagerie ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Captcha *