Aujourd'hui je vous propose de parler du moteur de recherche que vous me voyez utiliser dans certaines de mes vidéo. Les plus attentifs d'entre-vous auront remarqué un détail particulier : le nom de domaine localhost
. En effet, le moteur de recherche que j'utilise n'existe pas en ligne mais est est un petit serveur web qui tourne en local et qui agit comme un métamoteur de recherche.
Pourquoi s’embêter à créer une page de recherche maison alors qu’il en existe des dizaines déjà très performants ?
À la base, l’idée venait d’une simple vidéo que je voulais faire sur les moteurs de recherche alternatifs. Je voulais comparer les résultats de Google, DuckDuckGo, Qwant, etc. pour vois si il y avait une réelle différence dans la qualité des résultat. Pour cela l'objectif était de mélanger les réponses et de voir sur quel moteur je cliquais le plus souvent. Finalement, cette vidéo n’a jamais vu le jour, mais l'ergonomie m'a séduit et j'ai continué à itérer dessus.
Une autre motivation, plus universelle chez les développeurs : le besoin de personnalisation. Aucun moteur de recherche ne propose exactement la combinaison de fonctionnalités que je voulais :
Vu qu'aucun moteur ne regroupe tous ces points, il ne reste que la possibilitée de le construire à la main.
Mon moteur de recherche est donc un serveur web qui fonctionne en local et qui démarre avec mon système. Ce qui offre une rapidité d'affichage inégalable.
Lors d'une recherche le front-end va appeler une API local qui va interroger plusieurs moteurs de recherche pour récupérer les résultats qui seront affichés sous forme de liste sur 2 colonnes.
Le fond d'écran du moteur est chargé une fois par jour mais peut être remplacé si besoin (au cas où il ne me convient pas).
J'ai aussi implémenté quelques bangs pour effectuer des recherches plus rapidement. Ces bangs sont aussi transmis au front-end pour éviter l'aller retour avec le serveur (vu que ce sont de simples redirections dans la plupart des cas).
Certains bangs spéciaux affectent l'interface comme le bang !t
qui me permet d'initier un timer persistant.
J'ai aussi un système de blocklist qui me permet de bloquer certains noms de domaines, soit parce que ce sont des fermes à contenu, soit parce que ce sont des sites sur lesquels on ne peut pas rentrer (qui demandent un abonnement par exemple) et qui du coup ne peuvent pas être exploré.
Côté technique, j’ai choisi d'utiliser le langage Golang pour plusieurs raisons :
Pour la partie visuelle, j’ai utilisé Preact (une alternative légère à React) et du CSS classique. Le front communique avec Go via des appels API qui déclenchent les scrapers qui vont extraire les données de la page de résultat à l'aide de la librairie goquery.
Enfin, pour que le moteur soit toujours disponible, j’ai mis en place un petit système de service qui démarre automatiquement avec l’OS :
Et pour l’intégrer dans mon navigateur, j’ai ajouté un moteur de recherche personnalisé pointant vers localhost:8042
.
Au final, ce projet m’a permis d’explorer plus en profondeur Go et d’en tirer un petit boilerplate réutilisable. Mais surtout, il illustre bien ce que j’aime dans le fait d'être développeur : pouvoir utiliser nos compétences pour créer des solutions adaptées à nos besoins ou ceux des autres.