# SearXNG

> 把 SearXNG 实例 URL 指向 Search1API，无需自行运行实例，即可继续使用 SearXNG 的 JSON 搜索 API、引擎选择和分类。

Canonical URL: https://s1.dev/zh/docs/compatibility/searxng

Search1API 兼容 SearXNG 的 JSON 搜索 API。将你的 SearXNG 实例地址替换为：

```text
https://api.search1api.com/compat/searxng/YOUR_API_KEY
```

客户端可以在这个地址后追加 `/search`，也可以直接调用它，两种方式都可用。支持带查询参数的 `GET`，以及带表单请求体的 `POST`。

> **warn:** SearXNG 客户端无法发送认证请求头，因此密钥是 URL 的一部分。请把整个 URL 当作机密信息对待。Search1API 会在自己的日志中隐去该密钥。建议在[仪表盘](https://app.s1.dev)中为这个 URL 单独创建一个密钥，以便单独吊销。

迁移概览和配置变更请参见[从 SearXNG 迁移](https://s1.dev/compatible-apis/searxng)。

## 配置客户端

<Tabs items={['Open WebUI', 'Perplexica (Vane)', 'gpt-researcher', 'LangChain']}>

<Tab value="Open WebUI">

在 **Admin Settings → Web Search** 中选择 **searxng** 并设置 **Searxng Query URL**，或者设置环境变量：

```bash
SEARXNG_QUERY_URL="https://api.search1api.com/compat/searxng/YOUR_API_KEY/search?q=<query>"
```

</Tab>

<Tab value="Perplexica (Vane)">

```bash
SEARXNG_API_URL="https://api.search1api.com/compat/searxng/YOUR_API_KEY"
```

</Tab>

<Tab value="gpt-researcher">

```bash
RETRIEVER=searx
SEARX_URL="https://api.search1api.com/compat/searxng/YOUR_API_KEY"
```

</Tab>

<Tab value="LangChain">

```python
from langchain_community.utilities import SearxSearchWrapper

search = SearxSearchWrapper(
    searx_host="https://api.search1api.com/compat/searxng/YOUR_API_KEY"
)
results = search.results("hono cloudflare workers", num_results=5)
```

</Tab>

</Tabs>

或者直接调用：

```bash
curl "https://api.search1api.com/compat/searxng/YOUR_API_KEY/search?q=hono+workers&format=json"
```

## 参数

| 参数 | 行为 |
| --- | --- |
| `q` | 查询词。与 SearXNG 一样，开头的 `!go` 式引擎 bang、`!news` 式分类 bang 和 `:de` 式语言前缀都会生效。 |
| `format` | `json` 或省略。其他格式返回 `400`。 |
| `engines` | 以逗号分隔的 SearXNG 引擎名称，见下表。 |
| `categories` | 未提供 `engines` 时使用：`general`、`news`、`images`、`videos`（YouTube）、`science`（arXiv）和 `it`（GitHub）。其他分类按网页搜索处理。 |
| `language` | `en`、`en-US` 等代码按其主语言处理。`all` 和 `auto` 表示不过滤。 |
| `time_range` | `day`、`week`、`month` 或 `year`。 |
| `pageno` | 结果页码，每个引擎每页 10 条结果。参见[结果分页](https://s1.dev/zh/docs/compatibility/overview#how-requests-are-handled)。 |

其他参数，如 `safesearch`、`theme` 和 `image_proxy`，会被忽略。

## 引擎

| SearXNG 引擎 | Bang | 搜索范围 |
| --- | --- | --- |
| `google`, `bing`, `duckduckgo`, `yahoo`, `yandex`, `baidu`, `360search`, `quark` | `!go`, `!bi`, `!ddg`, `!yh`, `!yd`, `!bd`, `!360so`, `!qk` | 同一引擎 |
| `wikipedia`, `grokipedia` | `!wp`, `!gp` | 同一来源 |
| `youtube`, `bilibili`, `imdb` | `!yt`, `!bil`, `!imdb` | 同一来源 |
| `github`, `arxiv`, `reddit` | `!gh`, `!arx` | 同一来源 |
| `sogou wechat` | `!sogouw` | 微信文章 |
| `google news`, `bing news`, `yahoo news`, `duckduckgo news`, `hackernews`, `reuters` | `!gon`, `!bin`, `!yhn`, `!ddn`, `!hn`, `!reu` | 同一来源的新闻 |
| `google images`, `bing images`, `duckduckgo images` | `!goi`, `!bii`, `!ddi` | 同一引擎的图片 |

如果 `engines` 中列出了不在此表中的名称，它们会出现在 `unresponsive_engines` 中，原因为 `engine not supported`。如果列出的引擎都不受支持，请求会回退到 `categories`，或回退为网页搜索。

## 积分

每搜索一个引擎消耗 1 积分，与一次原生搜索的价格相同。未提供 `engines` 的请求会为每个分类搜索一个默认引擎，每个分类消耗 1 积分。无法提供所请求页码的引擎会被跳过，且不计费。

## 响应

响应采用 SearXNG 的 JSON 结构：`query`、`number_of_results`、`results`、`answers`、`corrections`、`infoboxes`、`suggestions` 和 `unresponsive_engines`。

- 来自多个引擎的结果会被合并。被多个引擎找到的 URL 只出现一次，`engines` 中列出所有相关引擎，`positions` 中列出其排名。
- `score` 根据这些排名按 SearXNG 的公式计算，因此按分数排序的客户端可以继续正常工作。
- 每条结果包含 `url`、`title`、`content`、`engine`、`engines`、`positions`、`score`、`category`、`template`、`parsed_url` 和 `publishedDate`。
- 图片结果还包含 `img_src` 和 `thumbnail_src`。它们的 `url` 是图片 URL，而不是图片所在页面的 URL。
- `number_of_results` 始终为 `0`，`answers`、`corrections`、`infoboxes` 和 `suggestions` 始终为空。

## 错误

错误返回 `{ "error": "message" }` 及相应状态码。当所有选中的引擎都失败时，请求返回最相关的错误，例如密钥无效时返回 `401`，触发速率限制时返回 `429`。当只有部分引擎失败时，请求仍会成功，并在 `unresponsive_engines` 中列出失败的引擎。