Babelia, un moteur de recherche aux sources disponibles

Il y a 11 ans, je commençais ma carrière professionnelle en ingénierie de logiciels avec le but de faire mieux que Google.

J’étais n’y au courant des usages, même si satisfait de MySQL (https://aneglus.free.fr), le gout pour l’aventure m’a amené à tester différent logiciel expert en donnée durable. J’ai programmé pour dans l’ordre MySQL, PostgreSQL, zodb, Neo4J (hypermove.net), MongoDB (Flask-Andalucia), Oracle Berkeley DB, feu sleepycat database et bsddb, wiredtiger (guile-babelia), j’ai aussi commencé un Doctorat en autonomie chez Wikimedia.

NLnet m’a fait une donation suite à mon travail sur l’implémentation de démonstration de la nouvelle version de mon moteur de recherche. Cette fois-ci, le moteur de recherche a été écrit en Python avec FoundationDB, même si ce n’est pas aussi bien que ce que j’avais imaginé, j’ai quand même exploré et documenter le sujet :

La page principale du projet est chez sourcehut lien direct vers la section décrivant la précédente feuille de route.

À la différence de https://search.marginalia.nu/, la Babelia (2022) fait seulement la recherche dans son propre index (il n’y a pas de wiki en support du moteur de recherche), l’avantage de Babelia, c’est que garantir le stockage cohérent et perenne est déléguée à FoundationDB. Plutôt que Java, sur ce projet, j’ai choisi CPython.

Les différences avec le projet Rust sur GitHub qui s’appelle tantivy/quickwit, c’est encore une fois FoundationDB, et FoundationDB seulement qui permet de monter à l’échelle, c’est-à-dire connaitre / stocker plus de documents. Je n’ai pas lu le code, donc je ne sais pas quel algorithme il utilise pour répondre aux utilisateurs.

L’algorithme de Babelia est décrit dans ce sujet dans le forum de l’association francophone python.

[à suivre…]

3 « J'aime »

Salut amirouche, merci d’avoir posté ton projet ici ! Je me demandais, as tu un guide façon « quick start » qui permettrait à quelqu’un de comprendre rapidement comment déployer une instance Babelia pour tester et comprendre les différents composants impliqués ?

:upside_down_face: Le lien direct vers le depot du code source c’est: https://git.sr.ht/~amirouche/python-babelia :slight_smile:

Merci beaucoup pour cette question : La facilité de déploiement de cette base de code est la principale fonctionnalité. Ensuite viens l’aspect pédagogique.

:male_detective: Comment on cherche

J’ouvre une parenthèse pédagogique sur le fonctionnement de la recherche

L’aspect pédagogique comme décrit sur le site de l’AFPY de mon premier billet, les algorithmes sont simples. Je paraphrase :

  • Au moment de l’enregistrement :

    1. Le code va créer une association identifiant du document → mot avec un Array / Hash Map / Dictionnaire
    2. Le code va « inverser » la relation document → mot pour avoir aussi une relation mot → document pour pouvoir retrouver les documents qui contiennent un mot de la demande de l’utilisateur
  • Au moment de la demande de l’utilisateur :

    1. Le code va sélectionner le mot le plus discriminant de la demande, et récupérer les documents qui contiennent ce mot
    2. Ensuite, l’algorithme va garder uniquement documents les plus pertinents.

:astronaut: Comment lancer le logiciel

Cette partie est un peu verbeuse, en effet, c’est sept commandes a taper pour demarrer.

Le grand avantage de cette base de code, c’est que c’est très simple de déployer pour jouer avec :

git clone https://git.sr.ht/~amirouche/python-babelia 
cd python-babelia
git checkout v0  # dernier tag stable...

Il faut installer foundationdb, pas de panique, sur debian / ubuntu:

wget https://github.com/apple/foundationdb/releases/download/7.1.3/foundationdb-clients_7.1.3-1_amd64.deb
wget https://github.com/apple/foundationdb/releases/download/7.1.3/foundationdb-server_7.1.3-1_amd64.deb
sudo dpkg -i foundationdb-*

Dans le dossier python-babelia

./venv

Cela va lancer une session bash ou le $SHELL, dans ce shell il faut faire:

uvicorn hyperdev.main:main

Il y a donc deux composants:

  • D’une part, python-babelia mon code du code python avec ces dépendances python, qui s’installent facilement ;
  • D’autre part, la base de donnée Apple à savoir. FoundationDB;

La mise à l’échelle de l’ensemble dépend de trois choses :

  • La taille de l’index avec plus d’espaces disques ;
  • Le nombre de demandes de recherche simultanées ;
  • La résilience de l’ensemble ;

On met de cote la résilience du système pour le moment.

Plus grand index

Pour pouvoir stocker plus de pages, il faut plus de disque, FoundationDB est conçu pour exploité un maximum d’espace sur plusieurs machines, et cela marche aussi sur une machine avec beaucoup de disque.

Si vous dépassez la taille de la mémoire vive disponible, vous pouvez faire :

fdbcli
configure ssd

Laissez-vous guider par l’invit de commande pour passer en stockage sur disque qui permet d’avoir plus d’enregistrement qu’il y a de mémoire vive disponible (remarque : en mode mémoire, le mode par défaut, les données sont aussi persistantes après un reboot).

Si vous exploitez l’ensemble d’une machine, ou que vous souhaitez avoir plus de résilience, je vous invite à lire le doc FoundationDB, c’est-à-dire que je m’y connais pas :slight_smile:

Plus de demandes de recherche concurrentes

A ce sujet, il y a deux curseurs, d’une part le nombre de process POSIX python, à savoir la commande uvicorn ... et donc un load balancer (exemple: haproxy) ou reverse proxy (nginx) devant les processus python.

D’autre part, le nombre de process POSIX utilise par FoundationDB. Pour commencer à monter l’échelle les lectures cote FoundationDB il faut éditer le fichier /etc/foundationdb/foundationdb.conf quelque part il y a la ligne :

[fdbserver.4500]

Il faut la dupliquer et changer le nombre, exemple:

[fdbserver.4500]
[fdbserver.4501]
[fdbserver.4502]
[fdbserver.4504]

Pour résumer, si vous déployez déjà des app python Django, c’est très similaire. Ce qui change, c’est la partie DB, comme expliqué dans ce billet, pour démarrer ce n’est pas hyper complexe.