SearXNG : donner la recherche web à un modèle local
SearXNG (logiciel libre sous licence AGPL-3.0, qui ne suit ni ne profile ses utilisateurs) est un métamoteur auto-hébergé : il relaie vos requêtes vers d'autres moteurs et fusionne leurs résultats, sans clé d'API ni facture. Pour un modèle local, l'étape qui débloque tout est d'ajouter « json » à la liste des formats de settings.yml (« html » seul par défaut), puis de rebrancher cette sortie JSON à votre interface de chat ou votre agent.
Un modèle ouvert ignore tout de cette semaine, et rien dans sa réponse ne vous prévient : il parlera du mois dernier avec le même aplomb que d'une table de multiplication apprise par cœur. Lui donner accès à une recherche web corrige ça. SearXNG est un métamoteur auto-hébergé qui rend ce service sans clé d'API, sans facture à la requête et sans compte — ce qui en fait la brique cohérente d'une installation locale, où l'on n'a pas envie d'envoyer chaque question chez un tiers.
#Pourquoi un modèle local a besoin du web
La connaissance d'un modèle s'arrête à sa date d'entraînement, et il ne sait pas où se situe cette frontière avec certitude. Deux solutions existent : lui fournir vous-même les faits dans le prompt, ou lui donner le moyen d'aller les chercher lui-même au moment de répondre. La recherche est la forme générale de la seconde, et la plus scalable dès que les questions varient.
La voie évidente est une API de recherche commerciale : un compte, une clé, une facture à la requête. SearXNG est l'alternative auto-hébergée. Vous exploitez l'instance, les requêtes partent de chez vous, aucun compte n'existe et rien n'est journalisé sauf si vous le décidez. Pour une installation dont l'intérêt est précisément que les données restent à la maison, envoyer chaque question à un service tiers par la porte de service serait un drôle d'endroit où s'arrêter.
Le projet lui-même se présente clairement comme un métamoteur où les utilisateurs ne sont ni suivis ni profilés, et il est distribué sous licence libre AGPL-3.0. C'est une licence copyleft forte : redistribuer une version modifiée, y compris comme service en ligne, oblige à republier le code source correspondant sous les mêmes termes. Pour un usage personnel ou interne à une équipe, cette clause ne se déclenche jamais : elle ne concerne que la redistribution d'une version modifiée à des tiers, pas le simple fait de faire tourner l'instance chez soi ou dans son entreprise.
#Ce que fait SearXNG, sans magie
Ton ChatGPT privé et gratuit sur ta machine en 1 heure — LM Studio, Ollama, Open WebUI, tes documents, sans cloud.
- Espace en ligne à vie
- PDF + fichiers
- Mises à jour à vie
SearXNG n'explore pas le web et ne possède aucun index. C'est un intermédiaire : votre requête part vers un ensemble configurable de moteurs existants, leurs réponses reviennent, sont dédupliquées et reclassées, et vous recevez une liste unique. Les moteurs interrogés ne voient pas votre adresse IP mais celle de l'instance.
Ce statut d'intermédiaire explique aussi la promesse de confidentialité mise en avant par le projet lui-même : les utilisateurs ne sont ni suivis ni profilés par l'instance. Aucun compte, aucun cookie de suivi publicitaire, aucun historique de recherche relié à une identité — ce qui distingue nettement SearXNG des moteurs commerciaux dont le modèle économique repose justement sur ce profilage des requêtes et des clics au fil du temps.
- La qualité est héritée
- Désactivez les moteurs qui renvoient du bruit pour votre usage précis : cela améliore les réponses du modèle davantage que n'importe quelle retouche de prompt, parce que le modèle ne peut pas rattraper un contexte de départ déjà pollué.
- L'automatisation ressemble à un abus
- Un humain lance quelques recherches par minute, une boucle d'agent en lance des dizaines. Les moteurs en amont répondent par des captchas et des blocages temporaires, que vous voyez arriver sous forme de résultats vides.
Cette dépendance forte aux moteurs en amont est le compromis central de tout métamoteur : SearXNG ne peut pas être meilleur que ce qu'il agrège, et il hérite aussi de leurs pannes et de leurs changements. Un moteur qui change son balisage HTML du jour au lendemain casse le module correspondant côté SearXNG jusqu'à sa mise à jour par les mainteneurs, ce qui explique pourquoi une instance figée depuis longtemps voit certains moteurs cesser silencieusement de répondre sans message d'erreur explicite.
#L'installer
- 01Déployer le conteneurL'image officielle est publiée sur Docker Hub (searxng/searxng) et sur GHCR (ghcr.io/searxng/searxng), toutes deux maintenues par le projet lui-même. Sur une machine unique, l'image plus un service de cache Valkey (le fork open source de Redis) suffisent amplement pour démarrer.
- 02Le garder sur le réseau localUne instance ouverte sur internet est trouvée en quelques jours et utilisée comme relais gratuit, ce qui fait bloquer son accès aux moteurs en amont. On la lie au réseau local, ou on place une authentification devant.
- 03Vérifier depuis la machine qui l'appelleraPas depuis votre navigateur. Un conteneur qui en appelle un autre a besoin de l'adresse visible depuis Docker, pas de localhost.
#Le réglage que tout le monde manque
Par défaut, une instance SearXNG fraîchement installée ne sert que du HTML : parfait pour un humain, totalement inutilisable pour un programme. La documentation officielle confirme que la clé search.formats de settings.yml ne contient que « html » par défaut, alors que csv, json et rss sont disponibles ; il faut y ajouter json puis redémarrer. C'est l'unique cause de la grande majorité des « ça ne marche pas » rencontrés en branchant SearXNG à une interface de chat.
#Le brancher à votre modèle
| Environnement | Rôle de SearXNG |
|---|---|
| Interface web de chat local | Fournisseur de recherche intégré : on renseigne l'URL de l'instance, les réponses gagnent une liste de sources |
| Cadriciel d'agents | Un outil de recherche que l'agent peut appeler |
| Chaîne de recherche documentaire | Étape de récupération pour les questions d'actualité, à côté de l'index de vos documents |
| Outil d'automatisation | Un simple appel HTTP vers le point d'accès JSON |
Le schéma est toujours le même : la recherche renvoie des extraits et des adresses, votre code ou votre interface en retient quelques-uns, et ils sont insérés dans le prompt avant que le modèle ne réponde à la question posée. Le modèle ne navigue pas : il lit ce qu'on lui a tendu. C'est pourquoi la qualité des extraits et la taille de la fenêtre de contexte pèsent ici plus lourd que la taille du modèle.
#Les réglages qui changent vraiment quelque chose
Une instance fraîchement installée active par défaut un grand nombre de moteurs, ce qui semble généreux mais dilue la qualité : plus de bruit, plus de doublons, plus de latence en attendant le moteur le plus lent du lot pour renvoyer sa réponse. La première vraie amélioration ne touche jamais le prompt du modèle, elle touche la liste des moteurs actifs et leur pertinence réelle pour l'usage visé.
- Couper les moteurs hors sujet
- Un usage centré sur la documentation technique n'a par exemple pas besoin des moteurs d'images ou de shopping activés par défaut. Chaque moteur en moins est une source de bruit en moins et une requête amont de moins à gérer au quotidien.
- Activer le cache
- Une base Valkey partagée évite de refaire une recherche identique à chaque appel d'un agent qui répète la même question dans une boucle, ce qui économise à la fois du temps de réponse et du quota précieux auprès des moteurs en amont.
- Fixer un budget de résultats
- Demander dix résultats quand le modèle n'en lira effectivement que trois gaspille beaucoup de contexte et de la latence pour rien de concret. Alignez le nombre de résultats retournés sur ce que votre prompt exploite vraiment réellement derrière, ni plus ni moins.
- Surveiller les journaux au démarrage
- Une instance récemment mise à jour vers Valkey peut échouer silencieusement si le nom d'hôte pointe encore vers un ancien service de cache. Un coup d'œil aux journaux du conteneur évite de chercher ailleurs un problème qui est là.
- Installer Open WebUI, l'interface qui consomme ces résultats
- Automatiser des enchaînements avec n8n et Ollama
- Architecture d'un agent local qui utilise des outils
- LiteLLM : un proxy unifié local et cloud
#Les limites à prévoir
- Les quotas des moteurs
- Des résultats vides signifient presque toujours un blocage en amont, pas une erreur de configuration côté SearXNG lui-même. Moins de moteurs actifs, plus de cache Valkey, et surtout pas d'agent qui cherche en boucle sans aucune limite de fréquence.
- Des extraits courts
- Pour du contenu en profondeur, il faut récupérer et nettoyer les pages derrière les liens : c'est le métier d'un extracteur dédié, pas d'un moteur de recherche qui ne fait que relayer des résultats déjà résumés en amont.
- Aucun classement intelligent
- SearXNG fusionne des résultats, il ne comprend pas votre question. Une requête vague renvoie un contexte vague, que le modèle résume consciencieusement sans jamais signaler que la question posée était mal formulée.
- L'entretien vous revient
- Les moteurs en amont changent leurs pages, les modules doivent suivre. Une instance laissée un an sans mise à jour se dégrade silencieusement.
- La migration Valkey concerne les anciennes instances
- Une instance montée il y a plus d'un an référence peut-être encore un ancien service de cache. Vérifiez le nom d'hôte configuré pour le limiteur : s'il ne correspond plus au conteneur réellement démarré aujourd'hui, la protection anti-robot échoue silencieusement plutôt que de bloquer proprement les abus.
#FAQ
SearXNG est-il gratuit ?+
Pourquoi mon instance renvoie du HTML et pas du JSON ?+
Puis-je utiliser une instance publique au lieu d'héberger la mienne ?+
Faut-il un GPU ?+
Pourquoi les résultats deviennent vides au bout d'un moment ?+
Est-ce que cela rend mon modèle à jour ?+
Que change la licence AGPL-3.0 de SearXNG pour moi ?+
- Source : dépôt GitHub de SearXNG
- Source : guide officiel d'installation en conteneur
- Source : documentation des formats de résultats
Un retour, une erreur, une précision ? Faites-nous signe, ça améliore le guide pour tout le monde.