Tinysearch, un moteur de recherche pour sites webs statiques🔗
Introduction
Depuis un mois, le site web que vous lisez utilise tinysearch, un moteur de recherche pour sites web statiques, en lieu et place d'une redirection vers un truc de chez google. Même si ce n'est pas parfait car il y a beaucoup de faux positifs ou de choses qui ne remontent pas bien dans cette recherche, on va dire que ça va le faire.
Avant, tout passait chez google et en 2021, tout le monde sait que Google, c'est le mal. Et puis, pour un site web statique, franchement, avoir un index local, c'est pas plus mal. Néanmoins, sa mise en place a été assez peu simple. Je pense qu'il est quand même temps de faire un retour sur tout ça.
Comment ça marche ?
Globalement dans ce que j'ai compris, tinysearch marche de la manière suivante:
- On commence par générer un index complet des mots du site web (en offline).
- La "configuration" de l'index se fait par l'absorption du texte via un fichier .json.
- Ensuite, on lance la commande tinysearch qui génère l'index ainsi que le javascript nécessaire à la génération du formulaire.
- Une fois que tout est réglé, il suffit d'uploader les quelques fichiers générés sur le site web et, le tour est joué.
- Online, la page charge le fichier d'index complet (d'où l'intérêt qu'il soit mesuré en volume) et la page dédiée fait de la recherche statique en utilisant l'index. Il ne se passe rien entre le navigateur web et le serveur HTTP.
Ça m'a semblé très intéressant comme solution pour les motifs suivants:
- C'est très respectueux de la vie privée des gens: Google ne sait pas ce que vous cherchez sur mon site web (ça ne le regarde pas en fait) et même moi, je ne le sais pas non plus (et d'ailleurs, je n'en ai rien à foutre, c'est votre vie, pas la mienne). Je vois que vous avez téléchargé l'index mais pas le texte de votre recherche.
- C'est léger pour le serveur HTTP qui sert le site web. Comme il n'y a aucune requête à traiter, pas de DOS possible via ce créneau. Au pire, il y a le fichier d'index mais ça se met en cache assez facilement alors.
- Un site web statique, c'est immobile par définition (enfin, sur une période de temps). Donc une recherche statique sur l'ensemble du site, c'est très adapté. Ça n'aurait pas été le cas forcément sur un site web dynamique (même si ne pas avoir de résultat de recherche sur l'article qui vient d'être rédigé il y a 5ms n'est pas un drame non plus).
- C'est fait en ligne de commande et ça s'insère bien dans mon script de publication de site web.
Comment je l'ai installé ?
Je me suis mis à l'installer directement, c'est à dire en mode bare-metal. Franchement utiliser docker pour construire et faire tourner un utilitaire en ligne de commande, c'est overkilling.
J'ai découvert au passage le bordel de l'intégration de Rust dans les distributions GNU/Linux. Globalement, Rust a ses dépôts sur un site web, peu de packages sont intégrés nativement dans Debian. Quand on lance la récupération des dépendances, on a l'impression qu'il te réinstalle l'équivalent de la libc + 10000 autres paquets dans ~/.cargo
qui du coup fait 500Mo chez moi (ce qui est énorme pour juste une commande). Bref, moins intégré tu peux pas et c'est dommage. C'est peut-être la raison d'être du Docker au final.
Attention, je ne crache pas sur Debian: les développeurs et les mainteneurs font un excellent travail. C'est dommage que Rust n'ai pas prévu plus de facilité pour que les paquets soient facilement gérés dans d'autres distributions. Mais ce n'est que la vision simpliste que j'ai pour l'instant, n'étant pas développeur Rust.
Voilà ce que j'ai balancé pour le construire:
apt install cargo binaryen libstd-rust-dev-wasm32 export PATH="/home/medspx/.cargo/bin:$PATH" cargo install wasm-pack git clone https://github.com/tinysearch/tinysearch.git cd tinysearch cargo build --release
Dans la pratique, j'ai ajouté .carbo dans mon PATH. C'est pratique et pas cher.
Comment je l'ai intégré ?
Il me restait surtout à générer le fichier JSON de configuration/contenu de l'index. J'ai fait un script Python pour ça, il vaut ce qu'il vaut et il est très adapté à mon cas d'utilisation personnelle. Mais il fait le job.
Conclusions
Bon, ce n'est pas parfait. J'ai pas mal de choses qui déconnent:
- Des mots qui n'existent pas dans le site web pointent vers des articles.
- A l'inverse, certains mots qui existent ne sont jamais retournés.
- On a des réponses parfois farfelues de redirection vers des articles qui ne contiennent pas le mot recherché.
- La génération reste quand même un poil lente (40 secondes environ). Je m'attendais à mieux vu que c'est fait en Rust mais bon, c'est fonction aussi de la qualité des algos.
- Il n'y a pas de fichier de configuration ce qui fait qu'on ne peut pas vraiment adapter le comportement de la génération de l'index.
Toutefois, à l'usage, c'est très rapide: taper un mot retourne des choses en quelques micro-secondes. Ensuite, l'index du site reste assez simple et de taille raisonnable.
Pour l'instant, ça va rester comme ça. Je n'ai pas le temps de modifier tinysearch pour l'adapter à mes besoins (notamment, à la langue française en excluant des mots de base comme le,la,les).
Au moins, ça me permet de ne plus dépendre de Google comme moteur de recherche sur mon site web personnel et ça, c'est déjà énorme en soi…