Archive

Articles taggués ‘recherche full-text’

Paris JUG : soirée « Emmanuel Bernard »

logoparisjug
La soirée du Paris JUG a commencé par une présentation de JDuchess : communauté féminine autour de Java. Il s’agit d’un groupe international qui a été fondé en Hollande.

Ensuite, la soirée « Emmanuel Bernard » s’est déroulée en deux parties : la première sur Hibernate Search et la seconde sur le design des APIs.

Première partie : Hibernate Search : recherche full-text pour des applications utilisant Hibernate.

Pour la recherche, il existe plusieurs modules de recherche full-text (par exemple avec SQL Server). Cependant, il n’existe pas de standard sur ces modules de recherche. Une autre solution pour réaliser de la recherche full-text est d’utiliser une librairie. Hibernate Search est basé sur  « Lucene », il permet de réaliser une recherche full-text avec les caractéristiques suivantes :

  • ordonne les résultats, les documents les plus pertinents seront dans les premiers résultats.
  • tolère les fautes de frappe ou orthographiques
  • on peut donner des priorités aux différents champs

La recherche full-text va s’appuyer sur un analyseur et plusieurs filtres. Parmi les filtres, on peut mettre tout en minuscule (recherche insensible à la case), enlever certains mots (le, la les).

Il y a plusieurs techniques qui permettent de comparer deux mots et donc qui permettent une recherche :

  • Recherche par approximation avec le calcul de distance de Levenshtein (distance entre deux mots). Si entre deux mots, 1 seule lettre change => bonne distance.
  • Recherche N-gram : cette technique permet de tolérer les fautes de saisie de l’utilisateur. Par exemple, au lieu de rechercher Hibernate, on découpe le mot en fragments de 3 lettres : Hib, ibe, ber et on recherche ces fragments … (le nombre de lettres du fragment est configurable).

D’un point de vue technique :

  • L’annotation @Indexed mise sur une entité permet de l’indexer en full-text. L’index sera mis à jour pour toute modification de l’entité.
  • L’annotation @Field crée un champ de recherche dans Lucene

Remarque : La recherche full-text se réalise uniquement sur du texte, des chaînes de caractères, Hibernate Search possède donc ses propres convertisseurs (date…)

Il est possible d’utiliser l’annotation @Fields qui permet de définir plusieurs types de recherche sur le même attribut. Il est possible de pondérer les différents critères. Par exemple, un mot trouvé dans un titre aura une meilleure pertinence que le même mot trouvé dans la description.

  • Recherche phonétique : prendre un mot et réaliser de la réduction phonétique (métaphone ou double métaphone, bien adapté aux langages latins).
  • Recherche de synonymes : on n’indexe pas le mot lui-même mais un mot de référence. Par exemple, pour like, cherish, le mot de référence sera love. On crée alors un sous-ensemble de la langue
  • Recherche par mots de la même famille (loving =>love) : on réduit un mot à sa racine. Le docteur Porter a écrit un algorithme sur ce principe appliqué à la langue anglaise (langage snowball). Ce dernier type de recherche est présent dans Hibernate Search, il s’agit de l’analyseur stem.

Astuce : il peut être judicieux de mettre plusieurs fields sur le même attribut pour pouvoir ajuster la pondération même en production.

Conclusion : Lucene est assez bas niveau, il peut donc être assez complexe à utiliser. Hibernate search est plus facile à mettre en place et permet de se concentrer sur le moteur de recherche.

Deuxième partie : Design d’API

Cette partie nous a exposé les bonnes pratiques pour faire de bonnes API (donc qui seront facilement utilisables par un maximum de personnes).

  • Tout d’abord, faire des APIs prend beaucoup de temps et aboutit à un produit qui ne satisfera jamais entièrement tout le monde.
  • Pour une API, il est préférable d’exposer que quelques méthodes (5 par exemple)
  • Il est bien que l’API couvre 80% des cas (les cas les plus fréquents) et si besoin qu’on puisse l’étendre pour des demandes bien spécifiques.
  • Une API doit être lisible et compréhensible de tous.
  • Une citation prise du snowboard et adaptée à la réalisation d’API : « If you don’t fall, you don’t make progress »
  • Utilisez l’API pendant que vous la développez
  • Pensez au-delà du code, la sémantique est très importante
  • Pour les méthodes, trouver un nom court et explicite

Bon pattern : method chaining pattern. La méthode renvoie l’objet lui-même, on peut donc appeler des méthodes à la chaîne.

Conclusion : pour une API, rendez les choses difficiles pour vous et simples pour les autres. Pour faire de bonnes APIs, il faut essayer et réessayer, penser aux utilisateurs et au futur de l’API.

Merci à Emmanuel Bernard pour cette soirée riche en enseignements. Une bonne présentation illustrée par de nombreux exemples de code et de démonstrations. Pour en savoir plus sur lui : http://blog.emmanuelbernard.com

Pour en savoir plus sur cette soirée, et si vous avez un compte google wave, une wave détaillant la dernière soirée du Paris JUG est accessible ici.