Recherche personnalisée avec Elasticsearch et le plugin Graph-Aided Search intégrant Neo4j

Cet article détaille le concept du Graph-Aided Search, une combinaison de deux technologies de pointe, respectivement Elasticsearch et Neo4j, permettant d’offrir un système de recherche ultra personnalisé.

Une brève introduction de Neo4j et Elasticsearch est l’introduction de cet article.

Neo4j et moteurs de recommendation

Ces dernières années, la popularité de Neo4j a augmenté de façon significative dans le monde des bases de données NoSQL et spécifiquement celles orientées graphe, faisant d’elle le choix technologique idéal pour les systèmes de recommendation en temps réel ou les applications de réseau social.

A première vue, les bases de données graphe n’ont l’air d’exceller que dans ces deux domaines, cependant il a été prouvé à maintes reprises que les domaines et industries qui nécessitent une base de données graphe afin de stocker, analyser et requêter des données à forte densité de connection va bien au delà de ces cas d’usage.

Similairement, les moteurs de recommendation vont bien au delà du domaine du e-commerce, nous avons déjà vu ces moteurs appliqués avec Neo4j dans les domaines suivants :

  • réseaux professionels (social)
  • candidats pour essais médicaux (pharma)
  • fraudeurs (banques, assurances, retail) (Panama Papers)
  • criminalité
  • activités

Généralement, l’entrée d’un point de recommendation sera un objet (par exemple un utilisateur) pour lequel nous déterminerons ses recommendations. Un tel objet est représenté par un noeud dans le graphe, le processus de recommendation sera dès lors une série de traversées faisant chemin depuis le noeud d’entrée vers d’autres noeuds, qui, selon certains critères seront retournés comme recommendation potentielle. Les traversées dans le graphe sont très peu coûteuses dans Neo4j qui offre des performances dépassant les 4 millions de traversée par seconde par coeur.

Elasticsearch et recherche texte

La majorité des sites webs et autres systèmes actuels offre une capacité de recherche, offrant aux utilisateurs la possibilité de trouver ce qu’ils cherchent.

Les moteurs de recherche basés sur Lucene, comme Elasticsearch et Solr, sont les technologies dominantes sur ce marché.

Tout comme les moteurs de recommendation avec Neo4j, Elasticsearch offre des performances inégalables quand il s’agit de recherche full-text ou par aggrégats, cependant elles sont leurs limitations quand il s’agit de données hautement connectées (comme la plupart des bases de données de la famille aggregate).

Le format d’entrée dans Elasticsearch est généralement une chaîne de caractères et les résultats sont des documents. Sans ajouter une couche de complexité, l’utilisateur faisant la recherche n’est pas pris en compte. Une même recherche par deux utilisateurs différents retournera les mêmes résultats.

Graph-Aided Search

Pour les mêmes raisons que les industries désirent personnaliser leurs moteurs de recommendation, ils veulent également personnaliser les résultats de recherche.

Un exemple extrêmement connu est la barre de recherche LinkedIn

Bare de recherche personnalisée sur LinkedIn

Quand vous tapez le prénom d’un de vos contacts, les résultats retournés sont ordonnés non pas exclusivement par leur rélévance textuelle, mais également par votre degré de connection avec les résultats retournés.

Nous pouvons imaginer cette fonctionnalité comme un système de recommendation dans lequel les recommendations candidates sont fournies par un système externe (un moteur de recherche texte dans ce cas).

En adoptant la philosophie “le bon outil pour le bon usage”, nous pouvons utiliser la recherche texte (T) et les moteurs de recommendation (R) ensemble afin de créer un système que nous appelons “Graph-Aided Search”:

  • Trouver toutes les recommendations potentielles (T)
  • Appliquer un score basé sur la rélévance textuelle (T)
  • Appliquer un score base sur le graphe social/autre de l’utilisateur (R)
  • Filtrer les recommendations irrélévantes ou blacklistées (R)

Un plugin Elasticsearch

Chez GraphAware, nous avons développé et publié sur Github un plugin étendant le query DSL d’Elasticsearch et offrant une connection vers une base de données graphe Neo4j.

Une image représentant le processus du plugin :

Graph-Aided Search

Brièvement, le plugin intervient juste avant le retour des résultats Elasticsearch à l’utilisateur, envoie ces résultats à un moteur de recommendation basé sur Neo4j, combine les deux scores (ou remplace en fonction des paramètres donnés dans la requête), réordonne les résultats et les renvoie à l’utilisateur.

Je ne vais pas rentrer plus en détail techniquement, cela fera partie de billets suivants et le README du dépôt github est relativement complet.

Conclusion

Nous adorons ces deux technologies et serions ravis de discuter autour de ce sujet. Nous serons biensûr présents à GraphConnect Europe et de temps en temps je suis de passage à Paris pour participer à pas mal de meetups.