跳到主要内容

Searxng 搜索

通过 SearXNG 进行免费元搜索 — 聚合来自 70 多个搜索引擎的结果。支持自托管或使用公共实例。无需 API 密钥。当主网络搜索工具集不可用时,会自动回退。

技能元数据

来源可选 — 通过 hermes skills install official/research/searxng-search 安装
路径optional-skills/research/searxng-search
版本1.0.0
作者hermes-agent
许可证MIT
平台linux, macos
标签搜索, searxng, 元搜索, 自托管, 免费, 回退
相关技能duckduckgo-search, domain-intel

参考:完整 SKILL.md

信息

以下是当此技能被触发时,Hermes 加载的完整技能定义。这是技能激活时,智能体所看到的指令。

SearXNG 搜索

使用 SearXNG 进行免费元搜索 — 这是一个注重隐私、可自托管的搜索聚合器,能够同时查询 70 多个搜索引擎。

使用公共实例时无需 API 密钥。也可以自托管以获得完全控制。当主网络搜索工具集 (FIRECRAWL_API_KEY) 未配置时,会自动显示为回退选项。

配置

SearXNG 需要一个 SEARXNG_URL 环境变量,指向你的 SearXNG 实例:

# 公共实例(无需设置)
SEARXNG_URL=https://searxng.example.com

# 自托管 SearXNG
SEARXNG_URL=http://localhost:8888

如果未配置实例,此技能将不可用,智能体会回退到其他搜索选项。

检测流程

在选择方法之前,先检查实际可用的选项:

# 检查 SEARXNG_URL 是否已设置且实例可达
curl -s --max-time 5 "${SEARXNG_URL}/search?q=test&format=json" | head -c 200

决策树:

  1. 如果 SEARXNG_URL 已设置且实例响应,使用 SearXNG。
  2. 如果 SEARXNG_URL 未设置或不可达,回退到其他可用的搜索工具。
  3. 如果用户特别想要 SearXNG,帮助他们设置一个实例或寻找一个公共实例。

方法一:通过 curl 的 CLI(首选)

使用 terminal 中的 curl 来调用 SearXNG JSON API。这避免了假设安装了任何特定的 Python 包。

# 文本搜索(JSON 输出)
curl -s --max-time 10 \
"${SEARXNG_URL}/search?q=python+async+programming&format=json&engines=google,bing&limit=10"

# 关闭安全搜索
curl -s --max-time 10 \
"${SEARXNG_URL}/search?q=example&format=json&safesearch=0"

# 特定类别(general、news、science 等)
curl -s --max-time 10 \
"${SEARXNG_URL}/search?q=AI+news&format=json&categories=news"

常用 CLI 标志

标志描述示例
q查询字符串(URL 编码)q=python+async
format输出格式:jsoncsvrssformat=json
engines逗号分隔的引擎名称engines=google,bing,ddg
limit每个引擎的最大结果数(默认 10)limit=5
categories按类别筛选categories=news,science
safesearch0=无,1=中等,2=严格safesearch=0
time_range筛选:dayweekmonthyeartime_range=week

解析 JSON 结果

# 从 JSON 中提取标题和 URL
curl -s --max-time 10 "${SEARXNG_URL}/search?q=fastapi&format=json&limit=5" \
| python3 -c "
import json, sys
data = json.load(sys.stdin)
for r in data.get('results', []):
print(r.get('title',''))
print(r.get('url',''))
print(r.get('content','')[:200])
print()
"

每个结果返回:titleurlcontent(摘要)、engineparsed_urlimg_srcthumbnailauthorpublished_date

方法二:通过 requests 的 Python API

使用 requests 库直接从 Python 调用 SearXNG REST API:

import os, requests, urllib.parse

base_url = os.environ.get("SEARXNG_URL", "")
if not base_url:
raise RuntimeError("SEARXNG_URL is not set")

query = "fastapi deployment guide"
params = {
"q": query,
"format": "json",
"limit": 5,
"engines": "google,bing",
}

resp = requests.get(f"{base_url}/search", params=params, timeout=10)
resp.raise_for_status()
data = resp.json()

for r in data.get("results", []):
print(r["title"])
print(r["url"])
print(r.get("content", "")[:200])
print()

方法三:searxng-data Python 包

要进行更结构化的访问,请安装 searxng-data 包:

pip install searxng-data
from searxng_data import engines

# 列出可用的引擎
print(engines.list_engines())

注意:此包仅提供引擎元数据,而不是搜索 API 本身。

自托管 SearXNG

要运行你自己的 SearXNG 实例:

# 使用 Docker
docker run -d -p 8888:8080 \
-v $(pwd)/searxng:/etc/searxng \
searxng/searxng:latest

# 然后设置
SEARXNG_URL=http://localhost:8888

或者通过 pip 安装:

pip install searxng
# 编辑 /etc/searxng/settings.yml
searxng-run

公共 SearXNG 实例可在以下位置找到:

  • https://searxng.example.com(替换为任何公共实例)

工作流程:先搜索后提取

SearXNG 返回标题、URL 和摘要,而不是完整的页面内容。要获取完整页面内容,先进行搜索,然后使用 web_extract、浏览器工具或 curl 提取最相关的 URL。

# 搜索相关页面
curl -s "${SEARXNG_URL}/search?q=fastapi+deployment&format=json&limit=3"
# 输出:带有标题和 URL 的结果列表

# 然后用 web_extract 提取最佳 URL

限制

  • 实例可用性:如果 SearXNG 实例宕机或不可达,搜索将失败。始终检查 SEARXNG_URL 是否已设置且实例可达。
  • 无内容提取:SearXNG 返回摘要,而不是完整页面内容。使用 web_extract、浏览器工具或 curl 获取完整文章。
  • 速率限制:一些公共实例会限制请求。自托管可以避免此问题。
  • 引擎覆盖范围:可用的引擎取决于 SearXNG 实例的配置。某些引擎可能被禁用。
  • 结果时效性:元搜索聚合外部引擎——结果的新鲜度取决于这些引擎。

故障排除

问题可能原因处理方法
SEARXNG_URL 未设置未配置实例使用公共 SearXNG 实例或自行搭建
连接被拒绝实例未运行或 URL 错误检查 URL 是否正确且实例正在运行
空结果实例屏蔽了查询尝试不同的实例或自行托管
响应缓慢公共实例负载过高自行托管或使用负载较低的公共实例
不支持 json 格式旧版 SearXNG尝试 format=rss 或升级 SearXNG

注意事项

  • 始终设置 SEARXNG_URL:没有它,技能无法运作。
  • 对查询进行 URL 编码:在 curl 中,空格和特殊字符必须进行 URL 编码,或在 Python 中使用 urllib.parse.quote()
  • 使用 format=json:默认格式可能不是机器可读的。始终明确请求 JSON。
  • 设置超时:始终使用 --max-timetimeout= 以避免在不可达的实例上挂起。
  • 自托管是最佳选择:公共实例可能会宕机、限流或屏蔽。自托管实例更可靠。

实例发现

如果 SEARXNG_URL 未设置且用户询问 SearXNG,帮助他们:

  1. 找到一个公共 SearXNG 实例(搜索 "public searxng instance")。
  2. 使用 Docker 或 pip 搭建自己的实例。

公共实例列于:https://searxng.org/