Pourquoi self-héberger son moteur de recherche sur VPS
Un moteur de recherche dédié remplace les LIKE '%...%' lents par une recherche instantanée, tolérante aux fautes de frappe et classée par pertinence. L'auto-héberger sur VPS vous épargne la facturation au nombre de recherches ou de documents des solutions SaaS, et garde votre index (donc vos données clients, votre catalogue) sur votre infrastructure. Meilisearch et Typesense sont conçus pour le 'search-as-you-type' : réponses en quelques millisecondes, API REST simple, typo-tolérance et facettes incluses. Meilisearch brille par sa simplicité de prise en main et la qualité de pertinence par défaut ; Typesense met l'accent sur la performance brute, le contrôle fin du ranking et le clustering haute disponibilité. Tous deux gardent l'index en RAM, ce qui dimensionne directement votre VPS.
Les atouts d'un moteur de recherche auto-hébergé
- Recherche instantanée avec typo-tolérance, sans coder l'algorithme
- Aucune facturation au document indexé ni à la requête
- Index et données métier conserves sur votre VPS
- Facettes, filtres et tri pour construire des interfaces de catalogue riches
- API REST et clés à portée restreinte pour un usage côté frontend sécurisé
- Synonymes et règles de pertinence ajustables à votre vocabulaire métier
Prérequis : la RAM avant tout
Ces moteurs gardent l'index actif en mémoire : la RAM est la ressource critique. Pour quelques dizaines de milliers de documents, 1 à 2 Go de RAM et 1 vCPU suffisent. Pour des centaines de milliers à quelques millions de documents avec facettes, visez 4 Go et 2 vCPU. Un disque SSD accélère la persistance et le rechargement au démarrage. Il vous faut Docker et Compose, un sous-domaine (search.votredomaine.com) si vous exposez l'API au frontend, et un reverse proxy pour le TLS. Prévoyez une clé maître forte et des clés de recherche à portée limitée pour ne jamais exposer la clé admin côté navigateur.
Déployer Meilisearch (ou Typesense) sur VPS
Définir le service Docker
Déclarez getmeili/meilisearch (ou typesense/typesense), montez un volume pour la persistance de l'index et passez la clé maître via une variable d'environnement (MEILI_MASTER_KEY ou TYPESENSE_API_KEY). Bindez le port 7700/8108 en local uniquement.
Lancer et vérifier la santé
Exécutez docker compose up -d puis testez curl http://127.0.0.1:7700/health. Une réponse available confirme que le moteur est prêt à recevoir des documents.
Créer l'index et alimenter les données
Envoyez vos documents en JSON par l'API (POST sur /indexes/produits/documents). Définissez les attributs cherchables, filtrables et triables ; en moteur de recherche, l'ordre de déclaration des attributs cherchables influence directement la pertinence.
Exposer l'API derrière un reverse proxy
Proxifiez search.votredomaine.com vers le port local avec Caddy ou Nginx pour le HTTPS. Activez le CORS uniquement vers votre domaine applicatif afin que seul votre frontend interroge le moteur.
Générer des clés à portée restreinte
Créez une clé limitée aux opérations de recherche sur un index donné, à utiliser côté navigateur. La clé maître ne doit jamais quitter le serveur ni apparaître dans le code frontend.
Synchroniser avec votre base
Mettez en place un job (webhook ou tache planifiée) qui pousse les créations et mises à jour vers l'index à chaque changement en base, pour garder la recherche cohérente avec la source de vérité.
| Critère | Meilisearch | Typesense |
|---|---|---|
| Prise en main | Très simple, pertinence par défaut excellente | Simple, contrôle plus explicite |
| Typo-tolérance | Native et réglable | Native, configurable par champ |
| Contrôle du ranking | Règles de classement ordonnées | Très granulaire (ranking par champ, poids) |
| Facettes / filtres | Complètes | Complètes et performantes |
| Haute disponibilité | Réplication en évolution | Clustering Raft intégré |
| Conso mémoire | Modérée | Optimisée, souvent plus frugale |
| Recherche vectorielle | Supportée | Supportée |
| Langage / déploiement | Rust, binaire unique | C++, binaire unique |
Avant de surdimensionner votre VPS, n'indexez que les champs réellement cherchables. Stocker un gros texte HTML complet dans l'index gonfle inutilement la RAM : indexez le titre, les tags et un résumé, et gardez le contenu lourd en base, récupéré après le clic. Vous diviserez souvent par deux ou trois l'empreinte mémoire pour une pertinence identique.