Skip to content
雨天的烟花
Go back

SearXNG:免费搭建搜索引擎

编辑文章

Table of contents

Open Table of contents

🔍 SearXNG 完全指南

SearXNG 是一个免费、开源、隐私保护的元搜索引擎,可以聚合 Google、Bing、DuckDuckGo、百度等 70+ 个搜索引擎的结果,完全免费且可自建。


🚀 快速部署

方法 1:Docker(推荐)

# 创建配置文件目录
mkdir -p searxng/{config,templates}

# 下载默认配置
docker run --rm searxng/searxng:latest cat /etc/searxng/settings.yml > searxng/config/settings.yml
docker run --rm searxng/searxng:latest cat /etc/searxng/limiter.toml > searxng/config/limiter.toml

# 启动容器
docker run -d \
  --name searxng \
  -p 8080:8080 \
  -v $(pwd)/searxng/config:/etc/searxng \
  -e SEARXNG_BASE_URL="http://localhost:8080/" \
  searxng/searxng:latest

访问:http://localhost:8080

方法 2:Docker Compose(生产环境推荐)

# docker-compose.yml
version: '3.8'

services:
  searxng:
    image: searxng/searxng:latest
    container_name: searxng
    ports:
      - "8080:8080"
    volumes:
      - ./config:/etc/searxng:rw
    environment:
      - SEARXNG_BASE_URL=http://localhost:8080/
      - SEARXNG_SECRET_KEY=your_secret_key_here  # 替换为随机字符串
    restart: unless-stopped
    cap_drop:
      - ALL
    cap_add:
      - CHOWN
      - SETGID
      - SETUID
    logging:
      driver: "json-file"
      options:
        max-size: "1m"
        max-file: "1"

启动:

docker-compose up -d

方法 3:源码安装

# 克隆仓库
git clone https://github.com/searxng/searxng.git
cd searxng

# 安装依赖
pip install -U searxng

# 运行
searxng run

⚙️ 配置详解

基础配置 (settings.yml)

# /etc/searxng/settings.yml

general:
  debug: false
  instance_name: "我的 SearXNG"
  privacypolicy_url: false
  donation_url: false
  contact_url: false
  enable_metrics: true

search:
  safe_search: 0  # 0=关闭, 1=中等, 2=严格
  autocomplete: "google"  # 自动补全引擎
  default_lang: "zh-CN"
  formats:
    - html
    - json

engines:
  # 启用中文搜索引擎
  - name: 百度
    engine: baidu
    shortcut: bd
    disabled: false
    
  - name: 必应
    engine: bing
    shortcut: bi
    disabled: false
    
  - name: 谷歌
    engine: google
    shortcut: gg
    disabled: false
    
  - name: DuckDuckGo
    engine: duckduckgo
    shortcut: ddg
    disabled: false

  # 专业搜索
  - name: 维基百科
    engine: wikipedia
    shortcut: wp
    disabled: false
    
  - name: GitHub
    engine: github
    shortcut: gh
    disabled: false

server:
  secret_key: "your_secret_key"  # 必须修改!
  limiter: false  # 关闭限流(内网使用)
  image_proxy: true  # 启用图片代理
  port: 8080
  bind_address: "0.0.0.0"
  
ui:
  default_theme: simple
  default_locale: "zh-CN"
  query_in_title: true
  infinite_scroll: true
  
outgoing:
  request_timeout: 3.0
  max_request_timeout: 10.0
  useragent_suffix: "my-searxng-instance"

启用/禁用引擎

# 查看可用引擎
docker exec searxng searxng info

# 编辑配置后重启
docker restart searxng

🔌 API 使用

JSON 格式搜索

# 基本搜索
curl "http://localhost:8080/search?q=AI+大模型&format=json"

# 指定引擎
curl "http://localhost:8080/search?q=python+tutorial&engines=google,github&format=json"

# 分页
curl "http://localhost:8080/search?q=machine+learning&pageno=2&format=json"

Python 调用示例

import requests
import json

class SearXNGClient:
    def __init__(self, base_url="http://localhost:8080"):
        self.base_url = base_url
    
    def search(self, query, engines=None, categories=None, 
               language="zh-CN", pageno=1, safesearch=0):
        """
        搜索接口
        
        Args:
            query: 搜索关键词
            engines: 指定引擎列表,如 ['google', 'bing']
            categories: 分类,如 ['general', 'images', 'news']
            language: 语言代码
            pageno: 页码
            safesearch: 安全搜索级别
        
        Returns:
            dict: 搜索结果
        """
        params = {
            'q': query,
            'format': 'json',
            'language': language,
            'pageno': pageno,
            'safesearch': safesearch
        }
        
        if engines:
            params['engines'] = ','.join(engines)
        
        if categories:
            params['categories'] = ','.join(categories)
        
        response = requests.get(f"{self.base_url}/search", params=params)
        return response.json()
    
    def get_engines(self):
        """获取可用引擎列表"""
        response = requests.get(f"{self.base_url}/engines")
        return response.json()

# 使用示例
client = SearXNGClient("http://localhost:8080")

# 基本搜索
results = client.search("2026年 AI 发展趋势", engines=['google', 'bing'])
print(f"找到 {len(results['results'])} 条结果")

for result in results['results'][:5]:
    print(f"\n📌 {result.get('title', '无标题')}")
    print(f"   🔗 {result.get('url', '无链接')}")
    print(f"   📝 {result.get('content', '无摘要')[:150]}...")
    if result.get('engine'):
        print(f"   🔍 来源: {result['engine']}")

# 搜索图片
image_results = client.search("AI 生成图片", categories=['images'])
print(f"\n找到 {len(image_results['results'])} 张图片")

# 搜索新闻
news_results = client.search("科技新闻", categories=['news'])
print(f"\n找到 {len(news_results['results'])} 条新闻")

高级搜索功能

# 多引擎对比搜索
def multi_engine_search(query, engine_list):
    client = SearXNGClient()
    
    for engine in engine_list:
        print(f"\n{'='*50}")
        print(f"🔍 使用 {engine} 搜索: {query}")
        print('='*50)
        
        results = client.search(query, engines=[engine])
        
        for i, result in enumerate(results['results'][:3], 1):
            print(f"{i}. {result.get('title', '无标题')}")
            print(f"   {result.get('url', '无链接')}")
            print()

# 使用示例
multi_engine_search("大语言模型", ['google', 'bing', 'baidu', 'duckduckgo'])

🤖 与 AI 应用集成

1. 与 Chatbox 集成

创建代理服务器:

# chatbox_proxy.py
from fastapi import FastAPI, HTTPException
from fastapi.middleware.cors import CORSMiddleware
import requests
from typing import Optional

app = FastAPI(title="SearXNG Proxy for Chatbox")

# 允许跨域
app.add_middleware(
    CORSMiddleware,
    allow_origins=["*"],
    allow_credentials=True,
    allow_methods=["*"],
    allow_headers=["*"],
)

SEARXNG_URL = "http://localhost:8080"

@app.get("/search")
async def search(q: str, engines: Optional[str] = None):
    """
    Chatbox 兼容的搜索接口
    """
    try:
        params = {
            'q': q,
            'format': 'json',
            'language': 'zh-CN',
            'pageno': 1
        }
        
        if engines:
            params['engines'] = engines
        
        response = requests.get(f"{SEARXNG_URL}/search", params=params, timeout=10)
        data = response.json()
        
        # 转换为 Chatbox 期望的格式
        formatted_results = []
        for result in data.get('results', [])[:10]:
            formatted_results.append({
                "title": result.get('title', ''),
                "url": result.get('url', ''),
                "content": result.get('content', ''),
                "engine": result.get('engine', ''),
                "score": result.get('score', 0)
            })
        
        return {
            "query": data.get('query', q),
            "number_of_results": data.get('number_of_results', len(formatted_results)),
            "results": formatted_results
        }
    
    except Exception as e:
        raise HTTPException(status_code=500, detail=str(e))

@app.get("/health")
async def health_check():
    """健康检查"""
    try:
        response = requests.get(f"{SEARXNG_URL}/healthz", timeout=5)
        return {"status": "healthy", "searxng": response.status_code == 200}
    except:
        return {"status": "unhealthy"}

if __name__ == "__main__":
    import uvicorn
    uvicorn.run(app, host="0.0.0.0", port=8000)

运行:

pip install fastapi uvicorn requests
python chatbox_proxy.py

在 Chatbox 中配置:

2. 与 LangChain 集成

# pip install langchain langchain-community
from langchain.utilities import SearxSearchWrapper
from langchain.tools import Tool

# 初始化 SearXNG
searx = SearxSearchWrapper(
    searx_host="http://localhost:8080",
    engines=["google", "bing"],
    categories=["general"],
    language="zh-CN"
)

# 创建搜索工具
search_tool = Tool(
    name="SearXNG Search",
    description="使用 SearXNG 进行联网搜索",
    func=searx.run
)

# 在 Agent 中使用
from langchain.agents import initialize_agent, AgentType
from langchain.llms import OpenAI

llm = OpenAI(temperature=0)
agent = initialize_agent(
    tools=[search_tool],
    llm=llm,
    agent=AgentType.ZERO_SHOT_REACT_DESCRIPTION,
    verbose=True
)

# 使用
result = agent.run("2026年最新的大语言模型有哪些?")
print(result)

3. 与 Open WebUI 集成

在 Open WebUI 中配置自定义搜索工具:

# tools/searxng_search.py
from typing import Optional
import requests

class SearXNGSearchTool:
    def __init__(self, base_url: str = "http://localhost:8080"):
        self.base_url = base_url
    
    def search(self, query: str, num_results: int = 5) -> str:
        """
        搜索并返回格式化结果
        """
        try:
            params = {
                'q': query,
                'format': 'json',
                'language': 'zh-CN',
                'pageno': 1
            }
            
            response = requests.get(
                f"{self.base_url}/search",
                params=params,
                timeout=10
            )
            
            data = response.json()
            results = data.get('results', [])[:num_results]
            
            formatted = []
            for r in results:
                formatted.append(
                    f"标题: {r.get('title', '')}\n"
                    f"链接: {r.get('url', '')}\n"
                    f"摘要: {r.get('content', '')}\n"
                    f"来源: {r.get('engine', '')}\n"
                )
            
            return "\n---\n".join(formatted)
        
        except Exception as e:
            return f"搜索失败: {str(e)}"

# 注册工具
tool = SearXNGSearchTool()

🇨🇳 国内使用注意事项

1. 引擎可用性

国内网络环境下,部分引擎可能无法访问:

# settings.yml - 国内推荐配置
engines:
  # ✅ 可用
  - name: 百度
    engine: baidu
    shortcut: bd
    disabled: false
    
  - name: 必应
    engine: bing
    shortcut: bi
    disabled: false
    
  - name: 搜狗
    engine: sogou
    shortcut: sg
    disabled: false
    
  # ⚠️ 可能需要代理
  - name: 谷歌
    engine: google
    shortcut: gg
    disabled: true  # 国内建议关闭
  
  - name: DuckDuckGo
    engine: duckduckgo
    shortcut: ddg
    disabled: true  # 国内建议关闭

2. 使用反向代理

# nginx 配置
server {
    listen 80;
    server_name searxng.yourdomain.com;
    
    location / {
        proxy_pass http://localhost:8080;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
        proxy_set_header X-Forwarded-Proto $scheme;
    }
    
    # 启用 HTTPS(推荐)
    listen 443 ssl;
    ssl_certificate /path/to/cert.pem;
    ssl_certificate_key /path/to/key.pem;
}

3. 添加代理支持

# settings.yml
outgoing:
  # 使用代理(如果需要访问国外引擎)
  proxy_url: "http://127.0.0.1:7890"  # 你的代理地址
  # 或者使用 Tor
  # using_tor_proxy: true
  
  # 自定义 User-Agent
  useragent_suffix: "SearXNG/1.0"

✅ 优缺点对比

优点

特性说明
💰 完全免费无需 API Key,无调用限制
🔒 隐私保护不记录搜索历史,不追踪用户
🎛️ 高度可定制可配置引擎、主题、插件
🌐 多引擎聚合支持 70+ 搜索引擎
📦 易于部署Docker 一键部署
🔌 API 友好标准 JSON 接口,易于集成
🌍 开源GitHub 开源,社区活跃

缺点

问题说明
🐢 速度较慢需等待多个引擎响应
🚫 部分引擎不可用国内网络限制
💻 需自建需要服务器资源
📊 结果质量不稳定依赖底层引擎
🔧 维护成本需定期更新和监控

📊 性能优化建议

1. 缓存配置

# settings.yml
search:
  # 启用结果缓存
  cache_url: "redis://localhost:6379/0"
  
server:
  # 启用压缩
  gzip: true
  
outgoing:
  # 调整超时
  request_timeout: 3.0
  max_request_timeout: 10.0

2. 限流配置

# limiter.toml
[botdetection.ip_limit]
link_token = true

[botdetection.ip_lists]
block_public_ips = false

3. 使用 CDN

# 启用缓存
proxy_cache_path /var/cache/nginx/searxng levels=1:2 keys_zone=searxng_cache:10m max_size=1g;

location / {
    proxy_cache searxng_cache;
    proxy_cache_valid 200 1h;
    proxy_cache_use_stale error timeout updating;
    proxy_pass http://localhost:8080;
}

🔧 故障排查

常见问题

# 1. 检查容器状态
docker logs searxng

# 2. 测试引擎连接
docker exec searxng searxng check-engine google

# 3. 重置配置
docker run --rm -v $(pwd)/config:/etc/searxng searxng/searxng:latest \
  sed -i 's/ultrasecretkey/$(openssl rand -hex 32)/' /etc/searxng/settings.yml

# 4. 更新版本
docker pull searxng/searxng:latest
docker restart searxng

📚 资源链接


🎯 总结

SearXNG 适合你,如果:

不适合,如果:

需要我帮你写一个完整的部署脚本或特定的集成示例吗?


编辑文章
Share this post on:

Previous Post
必备素养--工程认知
Next Post
智能体(Agent)核心组件