前言
在构建 AI 应用时,联网搜索能力是一个刚需。市面上的方案主要有两类:一类是 Tavily、Serper 这样的付费 API 服务,开箱即用但需要持续付费;另一类是自建搜索服务,前期投入一些配置时间,但后续完全免费且数据可控。
SearXNG 就是自建方案中的佼佼者。作为一款开源的元搜索引擎,它能聚合 70 多个搜索服务的结果,同时保护用户隐私。本文记录了在 Dify 中集成自建 SearXNG 的完整过程,从 Docker 部署到插件对接,帮你省下每月的搜索 API 费用。
SearXNG 是什么
SearXNG 是一款免费、开源的元搜索引擎(Metasearch Engine),它本身不爬取网页,而是将用户的搜索请求同时发送给多个搜索引擎(Google、Bing、DuckDuckGo 等),然后汇总、去重、排序后返回结果。你可以把它理解为"搜索引擎的搜索引擎"。
与直接使用 Google 或 Bing 不同,SearXNG 作为中间层代理了搜索请求,搜索引擎看到的是 SearXNG 服务器的 IP,而不是你的真实 IP。这种架构天然具备隐私保护能力。
核心特性
SearXNG 之所以适合作为 AI 应用的搜索后端,主要有以下几个原因:
隐私保护是 SearXNG 的核心设计理念。它不会追踪用户行为,不建立用户画像,不存储搜索历史,所有请求都是匿名的。对于企业内部部署的 AI 应用来说,这意味着敏感的搜索内容不会泄露给第三方。
多引擎聚合让搜索结果更全面。SearXNG 支持 70 多个搜索引擎,涵盖通用搜索(Google、Bing、DuckDuckGo)、学术搜索(Google Scholar)、代码搜索(GitHub)、问答社区(Stack Overflow)等多个类别。你可以根据需要启用或禁用特定引擎,甚至为不同类型的查询配置不同的引擎组合。
完全开源免费意味着没有 API 调用次数限制,没有月费,没有按量计费。只要你有一台服务器,就可以无限制地使用。对于搜索量大的应用场景,这能节省可观的成本。
JSON API 支持是与 AI 应用集成的关键。SearXNG 不仅提供 Web 界面,还支持 JSON 格式的 API 响应,可以直接被程序调用。Dify 的 SearXNG 插件正是基于这个 API 实现的。
Docker 部署让安装配置变得简单。官方提供了 Docker 镜像,几分钟就能跑起来,不需要复杂的环境配置。
与 Tavily 的对比
在选择搜索方案时,很多人会纠结于 SearXNG 和 Tavily 之间。这两者的定位其实有所不同:
Tavily 是专门为 AI 应用设计的搜索 API,它不仅返回搜索结果,还会抓取网页正文并提取关键内容,返回的数据对 LLM 更友好。但它是付费服务,免费额度有限,超出后按量计费。
SearXNG 是传统的元搜索引擎,返回的是搜索结果列表(标题、链接、摘要),不会主动抓取网页全文。优势是完全免费、可自建、隐私可控。
简单来说:如果你追求开箱即用且预算充足,选 Tavily;如果你想省钱、注重隐私、愿意多配置一点,选 SearXNG。两者也可以配合使用——用 SearXNG 搜索,再用 Jina Reader 或 Firecrawl 抓取正文。
环境准备
开始部署前,确保你的环境满足以下条件:
- Docker 及 Docker Compose 已安装
- Dify 服务已部署运行
- Dify 使用的 Docker 网络名称(本文以
acowbo_network为例)
SearXNG 需要与 Dify 在同一个 Docker 网络中,这样才能通过容器名直接通信,无需暴露外部端口。
Docker Compose 配置
创建部署目录和配置文件:
mkdir searxng-docker && cd searxng-docker
创建 docker-compose.yml 文件:
version: '3.8'
services:
searxng:
image: searxng/searxng:latest
container_name: searxng
logging:
driver: json-file
options:
max-size: "50m"
max-file: "3"
volumes:
- ./settings.yml:/etc/searxng/settings.yml:ro
environment:
- SEARXNG_BASE_URL=http://searxng:8080/
- UWSGI_DISABLE_LOGGING=true
restart: unless-stopped
networks:
- acowbo_network
networks:
acowbo_network:
external: true
这份配置有几个值得注意的地方:
没有配置 ports 端口映射,SearXNG 只能通过 Docker 内部网络访问,外部无法直接连接。这是有意为之的安全设计——既然只给 Dify 用,就没必要暴露到公网。如果你需要通过浏览器访问 SearXNG 的 Web 界面,可以加上 ports: - "19280:8080"。
日志配置限制了单个文件最大 50MB,最多保留 3 个文件。搜索服务的日志量可能很大,不加限制的话磁盘迟早会被撑爆。
networks 配置使用了外部网络 acowbo_network,这个网络需要提前存在(通常是 Dify 的 docker-compose 创建的)。如果你的 Dify 使用的是其他网络名,记得修改。
SearXNG 配置文件
创建 settings.yml,这是 SearXNG 的核心配置:
use_default_settings: true
general:
instance_name: "SearXNG"
search:
safe_search: 0
autocomplete: "google"
default_lang: "zh-CN"
formats:
- html
- json
server:
secret_key: "sxng-a8f3k2m9p4q7r1t6"
limiter: false
image_proxy: true
ui:
static_use_hash: true
default_theme: simple
results_on_new_tab: false
engines:
- name: duckduckgo
engine: duckduckgo
shortcut: ddg
disabled: false
- name: google
engine: google
shortcut: g
disabled: true
- name: bing
engine: bing
shortcut: b
disabled: true
- name: startpage
engine: startpage
shortcut: sp
disabled: true
- name: wikipedia
engine: wikipedia
shortcut: w
disabled: false
- name: github
engine: github
shortcut: gh
disabled: false
几个关键配置的说明:
formats 必须包含 json,这是 Dify 插件调用的前提。没有这个配置,API 只会返回 HTML 页面。
default_lang: "zh-CN" 设置默认搜索语言为中文,搜索结果会优先返回中文内容。
limiter: false 关闭了请求限流。在内网环境下,限流没有意义,反而可能影响 AI 应用的响应速度。
secret_key 是 SearXNG 内部使用的密钥(用于 session 加密等),不是访问认证用的。随便设置一个随机字符串即可。
搜索引擎配置中,我只启用了 DuckDuckGo 作为主引擎。原因是多引擎同时搜索会返回大量重复结果,而且部分引擎(如 Google)可能会因为请求频繁而触发验证码。DuckDuckGo 相对稳定,对于大多数场景够用了。如果你需要更全面的结果,可以按需开启其他引擎。
启动服务
配置完成后,启动容器:
docker-compose up -d
查看日志确认启动状态:
docker-compose logs -f
正常启动后会看到类似输出:
searxng | SearXNG 2025.12.19-8bf600cc6
searxng | [INFO] Starting granian (main PID: 1)
searxng | [INFO] Listening at: http://:::8080
searxng | [INFO] Spawning worker-1 with PID: 921
启动时可能会看到一些警告信息,比如 ahmia 和 torch 引擎加载失败。这两个是暗网搜索引擎,需要 Tor 网络才能使用,在普通环境下会自动禁用,不影响正常功能。
missing config file: /etc/searxng/limiter.toml 这个警告也可以忽略,因为我们已经在 settings.yml 中关闭了 limiter。
Dify 插件配置
SearXNG 服务运行起来后,接下来在 Dify 中安装插件并配置连接。
打开 Dify 的插件市场,搜索 "SearXNG" 并安装。这是 Dify 官方(langgenius)提供的插件,支持多种搜索类型(网页、图片、视频、新闻等)和时间范围筛选。
安装完成后,进入插件的授权配置页面,填写 SearXNG 的访问地址:
- 凭据名称:自定义一个名字,比如
me-searxng - SearXNG base URL:
http://searxng:8080
这里填写的是容器名 searxng 而不是 localhost 或服务器 IP。因为 Dify 和 SearXNG 在同一个 Docker 网络中,可以直接通过容器名进行服务发现和通信。
验证效果
配置完成后,在 Dify 的工作流中添加 SearXNG 搜索节点,测试一下搜索功能是否正常。
返回结果是 JSON 格式的数组,每条结果包含:
title:网页标题url:网页链接content:摘要内容engine:来源搜索引擎score:相关性评分
可以看到,SearXNG 返回的是搜索结果列表,而不是网页正文。如果你的 AI 应用需要读取网页全文来回答问题,可以在工作流中串联一个网页抓取节点(比如 Jina Reader),先用 SearXNG 搜索获取相关链接,再抓取链接内容。
常见问题
搜索结果太多怎么办?
在 Dify 调用 SearXNG 时,可以设置 max_results 参数限制返回数量,一般设置 5-10 条就够了。另外在 settings.yml 中减少启用的搜索引擎数量,也能减少重复结果。
搜索没有结果或报错?
检查 SearXNG 容器是否正常运行(docker ps),查看日志是否有错误(docker-compose logs)。常见原因是网络不通或搜索引擎被封禁。
如何添加更多搜索引擎?
在 settings.yml 的 engines 部分,将对应引擎的 disabled 改为 false 即可。完整的引擎列表可以参考 SearXNG 官方文档。
需要认证吗?
本文的配置没有启用认证,因为 SearXNG 只在 Docker 内部网络可访问,外部无法连接。如果你暴露了外部端口,建议在前面加一层 Nginx 反向代理并配置 Basic Auth。
总结
SearXNG 作为 Tavily 的开源替代方案,部署简单且完全免费,通过 Docker 内部网络与 Dify 通信既安全又高效。它聚合了 70 多个搜索引擎的结果,同时保护用户隐私,非常适合对成本敏感或有数据合规要求的场景。虽然它只返回搜索结果摘要而非完整网页内容,但配合 Jina Reader 等工具可以弥补这个不足,整体方案的灵活性反而更高。