SearXNG:构建你自己的私有元搜索引擎

本文深入介绍 SearXNG 这个免费开源的元搜索引擎,展示如何部署完全控制、不被跟踪、保护隐私的搜索实例,并详细讲解其架构设计、核心组件、自定义扩展方式以及 Docker 部署方案。

前言

你是否希望拥有一个完全控制、不被跟踪、保护隐私的元搜索引擎?一个可以搜索 Google、DuckDuckGo、Wikipedia 等多个搜索引擎,并聚合结果的强大工具?

SearXNG 正是这个问题的完美答案——它是一个免费、开源的元搜索引擎,让任何人都可以部署自己的搜索实例,享受真正的搜索自由。

本文将深入介绍 SearXNG 的架构设计、核心组件、自定义扩展方式以及 Docker 部署方案。


什么是 SearXNG?

核心理念

SearXNG 是一个免费、开源的互联网元搜索引擎,用于从各种搜索服务和数据库中聚合结果。

核心特性

  • 🔒 隐私优先:不跟踪用户,不建立用户画像
  • 🌐 聚合多个搜索引擎:Google、DuckDuckGo、Wikipedia 等
  • 🎨 可定制界面:支持主题和布局自定义
  • 🔧 可扩展:支持自定义搜索引擎和解析器
  • 🐳 Docker 部署:一键部署,易于维护
  • 🌍 Tor 支持:可通过 Tor 使用,增强匿名性

项目信息

属性 信息
GitHub searxng/searxng
官网 searxng.org
Docker 镜像 docker.io/searxng/searxng:latest
文档 docs.searxng.org
许可证 MIT

架构设计

整体架构

SearXNG 采用模块化、插件式架构,由多个核心组件构成:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
┌─────────────────────────────────────────────────────┐
│ 用户请求 │
│ │ │
│ ▼ │
│ ┌─────────────────┐ │
│ │ Web 界面 │ │
│ │ (Flask) │ │
│ └─────────────────┘ │
│ │ │
│ ▼ │
│ ┌──────────────────────────┐ │
│ │ SearXNG 核心 │ │
│ │ ├── 引擎加载器 │ │
│ │ ├── 搜索处理器 │ │
│ │ ├── 结果缓存 │ │
│ │ ├── 答题引擎 │ │
│ │ └── 数据库 │ │
│ └──────────────────────────┘ │
│ │ │
│ ▼ │
│ ┌───────────────────────┐ │
│ │ 外部搜索引擎 │ │
│ │ (Google, DuckDuckGo, │ │
│ │ Wikipedia, etc.) │ │
│ └───────────────────────┘ │
│ │ │
└─────────────────────────────────────────────────────┘

核心组件

1. Web 界面层

技术栈

  • 框架:Flask
  • 语言:Python
  • 模板:支持多个主题模板

功能

  • 🎨 美观的搜索界面
  • 🔍 搜索历史记录
  • ⚙️ 设置页面
  • 📊 结果展示和过滤
  • 🌐 多语言支持

2. 搜索引擎(Engines)

SearXNG 的核心是可插拔的搜索引擎架构,支持多种类型的引擎:

在线引擎

1
2
3
4
5
# 示例:Google 搜索引擎
class GoogleEngine:
def search(self, query, params):
# 实现 Google 搜索逻辑
pass

支持的在线引擎类型(已文档化):

  • 🔎 Demo Online Engine
  • 📄 XPath Engine
  • 📖 MediaWiki Engine
  • 📦 JSON Engine
  • 🏢 Adobe Stock
  • 🐧 Alpine Linux Packages
  • 📦 Anna’s Archive
  • 🔖 Arch Linux
  • 📄 arXiv
  • ☁️ Azure Resources
  • 🔍 BIng Engines
  • 💾 Brave Engines
  • 📊 BT4G
  • 🇨🇳 ChinaSo
  • ⚙️ CORE
  • 🌐 Crossref
  • ⏱️ Dailymotion
  • 💬 Discourse Forums
  • 🦆 DuckDuckGo Engines
  • 🐧 Geizhals
  • 🌐 GitHub Code
  • 🤗 GitLab
  • 💬 Hugging Face
  • 🔍 LLM 火花引擎
  • 📚 Library of Congress
  • 🔍 Marginalia Search
  • 💬 Mastodon
  • 🔎 Moviepilot
  • 🔋 Mwmbl Engine
  • 🛢 Odysee
  • 🎯 OpenAlex
  • 📖 Open Library
  • 📺 PeerTube Engines
  • 🧱 Pipéd
  • 🔍 Presearch Engine
  • 📖 PubMed
  • 🔟 Radio Browser
  • 📚 Recoll Engine
  • 🧭 Repology
  • 🔍 Reuters
  • 💻 Seekr Engines
  • 🔍 Semantic Scholar
  • 🔊 SoundCloud
  • 📄 SourceHut
  • 🔍 Startpage Engines
  • 🏷️ Tagesschau API
  • 🌐 Torznab WebAPI
  • 📺 Tube Archivist
  • 📚 Void Linux binary packages
  • 🧱 Wallhaven
  • 📚 Wikipedia
  • 🌐 Yahoo Engine
  • 📚 Z-Library

离线引擎

  • 💾 离线概念(离线数据库索引)
  • 🔍 命令行引擎
  • 📊 SQL 引擎(MySQL、PostgreSQL 等)
  • 🌐 本地搜索 API 索引

3. 搜索处理器(Search Processors)

用于处理和转换搜索结果

示例处理器

  • 🔄 结果去重
  • 📊 结果排序和过滤
  • 🌐 URL 标准化
  • 📝 摘要生成
  • 🔗 链接跟踪
  • 🏷️ 跨语言翻译

4. 结果类型(Result Types)

基础类型

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
from searx.result_types import EngineResults

class CustomResultList(EngineResults):
def response(self, resp):
res = EngineResults()

# 添加文本回答
res.add(
res.types.Answer(
answer="这是一个基于 Python 的搜索引擎",
url="https://example.org"
)
)

# 添加图像结果
res.add(
res.types.Image(
title="示例图片",
url="https://example.com/image.jpg",
thumbnail_url="https://example.com/thumb.jpg"
)
)

# 添加视频结果
res.add(
res.types.Video(
title="示例视频",
url="https://example.com/video.mp4"
)
)

return res

支持的结果类型

  • Answer:文本答案
  • Image:图片结果
  • Video:视频结果
  • Audio:音频结果
  • File:文件结果
  • Discussion:讨论帖
  • Torrent:种子文件
  • Social:社交媒体帖子

5. 答题引擎(Answerers)

用于生成直接答案,无需访问外部搜索引擎:

类型

  • 🔮 本地 LLM(大语言模型)
  • 📚 知识库
  • 🤖 Wikipedia API
  • 🔮 LLM API(Claude、GPT 等)

6. 数据库层

SearXNG 支持多种数据库:

类型

  • 💾 SQLite:轻量级,适合小型部署
  • 🐘 PostgreSQL:功能丰富,支持复杂查询
  • 🗄️ MySQL:广泛使用,高性能
  • 🍃 MongoDB:文档型数据库
  • 🔍 ValkeyDB:键值对数据库
  • 💾 Valkey:高性能,适合缓存

自定义搜索引擎

创建自定义引擎

1. 在线搜索引擎

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# searxng_extra/engines/my_engine.py
from searx.enginelib import Engine

class MySearchEngine(Engine):
# 引擎元数据
name = "My Engine"
id = "my_engine"
description = "My custom search engine"

def search(self, query, params):
# 实现搜索逻辑
results = []

# 发送 HTTP 请求
response = requests.get(f"https://api.example.com/search?q={query}")
data = response.json()

# 转换为 SearXNG 结果格式
for item in data['results']:
results.append({
'title': item['title'],
'url': item['url'],
'content': item['snippet'],
})

return results

2. 离线搜索引擎

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# 离线数据库搜索
from searx.enginelib import Engine, OfflineEngine

class LocalDatabaseEngine(Engine, OfflineEngine):
def __init__(self, db_path):
self.db_path = db_path

def search(self, query, params):
# 连接到数据库
conn = sqlite3.connect(self.db_path)
cursor = conn.cursor()

# 执行搜索查询
cursor.execute(
"SELECT * FROM documents WHERE content LIKE ?",
(f"%{query}%",)
)

results = cursor.fetchall()
conn.close()

return results

3. 注册自定义引擎

searxng_extra/engines/ 目录中创建引擎文件,SearXNG 会自动加载:

1
2
# searxng_extra/engines/my_custom_engine.py
# 保存到指定目录后,SearXNG 会自动发现并加载

自定义搜索处理器

1
2
3
4
5
6
7
8
9
10
11
12
13
# searxng_extra/search_processors/my_processor.py
def process_results(results):
# 自定义处理逻辑
processed = []

for result in results:
# 去重
if result['url'] not in seen_urls:
# 提取更多信息
enhanced = enhance_result(result)
processed.append(enhanced)

return processed

Docker 部署

快速部署

方法 1:使用官方 Docker 镜像

1
2
3
4
5
6
7
8
9
10
11
12
# 拉取最新镜像
docker pull docker.io/searxng/searxng:latest

# 运行容器
docker run -d \
--name searxng \
-p 8080:8080 \
-v searxng_data:/etc/searxng \
-v searxng_logs:/var/log/searxng \
-e INSTANCE_NAME=searxng \
-e BASE_URL=http://your-domain.com \
docker.io/searxng/searxng:latest

端口映射说明

  • 主机 8080容器 8080:SearXNG 服务端口
  • 如果使用反向代理,映射到其他端口(如 8888)

方法 2:使用 Docker Compose

创建 docker-compose.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
version: '3.8'

services:
searxng:
image: docker.io/searxng/searxng:latest
container_name: searxng
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- searxng_data:/etc/searxng
- searxng_logs:/var/log/searxng
environment:
- INSTANCE_NAME=searxng
- BASE_URL=http://your-domain.com
- UWSGI_WORKERS=-4
- UWSGI_THREADS=-4

启动服务

1
2
3
4
5
6
7
8
# 启动服务
docker-compose up -d

# 查看日志
docker-compose logs -f searxng

# 停止服务
docker-compose down

方法 3:反向代理配置

如果使用 Caddy 作为反向代理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
version: '3.8'

services:
caddy:
image: caddy:2-alpine
container_name: caddy
restart: unless-stopped
ports:
- "80:80"
- "443:443"
volumes:
- ./caddy/Caddyfile:/etc/caddy/Caddyfile
- caddy_data:/data
- caddy_config:/config
networks:
- searxng_network

searxng:
image: docker.io/searxng/searxng:latest
container_name: searxng
restart: unless-stopped
ports:
- "8080:8080"
volumes:
- searxng_data:/etc/searxng
- searxng_logs:/var/log/searxng
environment:
- INSTANCE_NAME=searxng
networks:
- searxng_network

Caddy 配置Caddyfile):

1
2
3
4
5
6
example.com {
reverse_proxy searxng {
to http://searxng:8080
header_up Host {host}
}
}

环境变量配置

SearXNG 支持以下环境变量:

变量 说明 默认值
INSTANCE_NAME 实例名称 searxng
BASE_URL 基础 URL 自动检测
SEARXNG_UWSGI_WORKERS uWSGI 工作进程数 -4
SEARXNG_UWSGI_THREADS 每个进程的线程数 -4
LOG_LEVEL 日志级别 INFO

数据持久化

重要目录

1
2
3
4
5
6
7
8
9
10
# searxng_data: 配置文件和数据库
- /etc/searxng/
├── settings.yml
├── engines/
└── searxng.yml

# searxng_logs: 日志文件
- /var/log/searxng/
├── searxng.log
└── searxng-error.log


配置与定制

自定义主题

SearXNG 支持自定义主题模板:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# searxng_extra/templates/my_theme.html
<!DOCTYPE html>
<html>
<head>
<title>我的搜索 - SearXNG</title>
<style>
body {
font-family: 'Arial', sans-serif;
background-color: #f5f5f5;
color: #333;
}
.results {
max-width: 800px;
margin: 0 auto;
}
</style>
</head>
<body>
<h1>🔍 搜索结果</h1>
<div class="results">{% block results %}</div>
</body>
</html>

搜索设置

创建 searxng_extra/engines/settings.yml

1
2
3
4
5
6
7
8
9
10
11
12
13
14
# 启用/禁用引擎
enabled_engines:
- google
- duckduckgo
- wikipedia

# 自定义权重
engine_weights:
google: 1.0
duckduckgo: 0.8
wikipedia: 0.6

# 结果排序
sort_by: relevance

高级功能

1. Tor 支持

通过 Tor 匿名访问 SearXNG:

1
2
3
# 使用 Tor 网络访问
# 确保 Tor 服务运行在 9050 端口
# 将 SearXNG 配置为使用 Tor 代理

2. 结果缓存

SearXNG 内置了结果缓存机制:

1
2
3
4
# 启用缓存(在 settings.yml 中配置)
cache:
enabled: true
ttl: 3600 # 缓存时间(秒)

3. 搜索历史

为注册用户保存搜索历史:

1
2
3
4
# settings.yml
history:
enabled: true
max_items: 50 # 最大历史记录数

4. 速率限制

防止滥用:

1
2
3
4
5
6
7
8
# searxng_extra/middleware/rate_limiter.py
from searx.limiter import RateLimiter

# 配置限速
rate_limiter = RateLimiter(
max_requests=100,
period=3600 # 1小时内 100 次请求
)

实际应用场景

场景 1:家庭私有搜索

需求

  • 不被跟踪的搜索体验
  • 整合多个搜索引擎
  • 在家庭设备上运行

部署

1
2
3
4
5
6
7
8
9
services:
searxng:
image: docker.io/searxng/searxng:latest
ports:
- "8080:8080"
volumes:
- ./searxng_config:/etc/searxng
environment:
- INSTANCE_NAME=home-search

场景 2:企业内网搜索

需求

  • 整合内部文档搜索
  • 支持 LLM 答题
  • 私密性保护

配置

1
2
3
4
5
6
7
8
9
10
# 添加企业搜索引擎
enabled_engines:
- internal_wiki
- llm_answerer

# 配置 LLM API
answerer:
provider: openai
api_key: ${OPENAI_API_KEY}
model: gpt-4

场景 3:学术研究搜索

需求

  • 聚合多个学术数据库
  • 支持 arXiv、Semantic Scholar 等
  • 高质量结果排序

配置

1
2
3
4
5
6
# 优先学术引擎
engine_weights:
arxiv: 1.5
semantic_scholar: 1.5
pubmed: 1.3
wikipedia: 0.8

场景 4:开发者测试

需求

  • 测试自定义搜索引擎实现
  • 调试搜索处理器
  • 验证结果格式

部署

1
2
3
4
5
6
# 开发模式
docker-compose -f docker-compose.dev.yml

# 使用本地代码挂载
volumes:
- ./searxng_extra:/etc/searxng/extra


性能优化

1. 数据库优化

SQLite 优化

1
2
3
4
5
6
7
-- 创建索引
CREATE INDEX IF NOT EXISTS idx_content ON documents(content);

-- 优化查询
SELECT * FROM documents
WHERE content LIKE ?
LIMIT 20;

PostgreSQL 优化

1
2
3
4
5
6
-- 全文搜索索引
CREATE EXTENSION IF NOT EXISTS pg_trgm;

-- 创建 GIN 索引
CREATE INDEX idx_content_gin ON documents
USING gin (to_tsvector('content'));

2. 缓存策略

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
# searxng_extra/cache/redis_cache.py
import redis

# Redis 缓存
cache = redis.Redis(
host='localhost',
port=6379,
db=0
)

def get_cached_results(query):
key = f"search:{query}"
cached = cache.get(key)

if cached:
return json.loads(cached)

return None

def cache_results(query, results, ttl=3600):
key = f"search:{query}"
cache.setex(key, json.dumps(results), ttl)

3. 并发处理

1
2
3
4
5
6
7
# uWSGI 配置
[uwsgi]
workers = 4
threads = 4
processes = 16

# 提高 UWSGI 进程数

安全与隐私

隐私保护机制

  1. 不跟踪用户:默认不记录搜索历史
  2. 不建立用户画像:不收集用户行为数据
  3. 可选登录:用户可以选择是否登录
  4. 匿名模式:支持 Tor 访问
  5. HTTPS 强制:所有通信使用加密

安全最佳实践

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
# settings.yml
security:
# 强制 HTTPS
force_https: true

# 禁用不安全的搜索引擎
disable_http_engines: true

# 速率限制
rate_limit:
enabled: true
max_requests: 100
period: 3600

# CSP 头
content_security_policy:
default_src: "'self'"
script_src: "'self'"

监控与维护

日志管理

1
2
3
4
5
6
7
8
# 查看实时日志
docker-compose logs -f searxng --tail=100

# 查看错误日志
docker-compose logs -f searxng | grep ERROR

# 导出日志
docker-compose logs -f searxng > searxng_logs.txt

健康检查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
# searxng_extra/health_check.py
import requests

def check_health():
try:
response = requests.get(
'http://localhost:8080/health',
timeout=5
)

if response.status_code == 200:
print("✅ SearXNG is healthy")
return True
else:
print("❌ SearXNG is unhealthy")
return False

except Exception as e:
print(f"⚠️ Health check failed: {e}")
return False

故障排查

常见问题

1. 容器无法启动

1
2
3
4
5
6
7
8
# 查看容器日志
docker logs searxng

# 检查端口占用
netstat -tlnp | grep 8080

# 检查防火墙
sudo ufw status

2. 数据库连接失败

1
2
3
4
5
# 检查数据库文件权限
ls -la /path/to/searxng_data/

# 检查数据库是否损坏
sqlite3 searxng.db "PRAGMA integrity_check;"

3. 搜索结果为空

1
2
3
4
5
6
# 启用调试日志
# 在 settings.yml 中设置
debug: true

# 检查引擎配置
# 确认启用的搜索引擎可用

与其他方案对比

特性 SearXNG Google DuckDuckGo
开源
隐私 ✅ 不跟踪 ❌ 跟踪 ✅ 不跟踪
多引擎聚合
自定义 ✅ 可扩展
自托管
Tor 支持 ⚠️ 有限
部署难度 中等 困难 简单
学习曲线 中等

总结

SearXNG 是一个功能强大、灵活可扩展的私有元搜索引擎解决方案

核心优势

  1. 隐私优先:不跟踪、不建立用户画像
  2. 多引擎聚合:整合 100+ 搜索引擎
  3. 高度可定制:支持自定义引擎和处理器
  4. 易于部署:Docker 一键部署
  5. 灵活架构:模块化设计,易于扩展
  6. 开箱即用:支持多种数据库和缓存后端
  7. Tor 支持:增强匿名性

适用场景

  • ✅ 家庭私有搜索服务器
  • ✅ 企业内网搜索引擎
  • ✅ 学术研究搜索平台
  • ✅ 开发者测试环境
  • ✅ 隐私保护的搜索体验

资源链接


如果你希望拥有一个完全控制、保护隐私的私有搜索引擎,SearXNG 是理想的选择!开始部署你自己的搜索实例吧! 🔍🎨