diff --git a/plugins/searxng-search/README.md b/plugins/searxng-search/README.md index cdbb4a8..28e6481 100644 --- a/plugins/searxng-search/README.md +++ b/plugins/searxng-search/README.md @@ -155,19 +155,48 @@ SearXNG 2026.10.7-6671d89be, `docker.io/searxng/searxng:latest` (built | Engine | Status | | --- | --- | -| `bing` | Active. Needs `base_url: https://cn.bing.com`; `www.bing.com` blocks scraping from this network. | -| `yandex` | Active. Best measured relevance here on both Chinese and English technical queries; first result for a V1→V2 migration query is the migration doc itself. Default. | -| `bing` | Active, but needs `base_url: https://cn.bing.com`; `www.bing.com` blocks scraping from this network. Default. Supports neither paging nor `time_range`. | -| `naver` | Active and strongest on English, but 0/9 relevant on a Chinese query, so it is left out of the defaults rather than allowed to dilute them. Pass `engines=naver` explicitly for English lookups. | -| `360search` | Active, and the **worst** engine on both query types: 0/5 relevant on a Chinese query, where it splits on "V1"/"V2" and returns Android and CANN version-difference articles. Removed from the defaults. | +| `bing` | Active and reliable, 5/5 non-empty runs on both query types. Needs `base_url: https://cn.bing.com`; `www.bing.com` blocks scraping from this network. Default. | +| `yandex` | Active and reliable, 5/5, 15 results per run. Best measured relevance here; first result for a V1→V2 migration query is the migration doc itself. Default. | +| `naver` | Reliable, 5/5. Strongest on English (migration doc ranked #1) but 0/9 on a Chinese query, so it is left out of the defaults and worth passing explicitly for English lookups. | +| `360search` | Reliable but returns 4–5 results at 0% relevance. It splits the query on "V1"/"V2" and answers with Android and CANN version-difference articles. Removed from the defaults. | +| `quark` | Unusable. Returned 11/11 relevant results twice, then 0 results on 5 consecutive runs of each query. Rate-limited after a couple of requests. | | `baidu` | Disabled. Answers with a CAPTCHA and suspends the client IP for an hour. | -| `sogou` | Disabled. The upstream engine raises `AttributeError` in this release. | -| `mojeek`, `ecosia`, `marginalia` | Dropped by `keep_only`; not reachable from this network. | +| `sogou` | Disabled. The upstream engine raises `AttributeError` at `searx/engines/sogou.py:56` (`resp.next_request`) in this release. | `bing` supports neither paging nor `time_range`, so on this instance `pageno > 1` and `time_range` both narrow the result to nothing useful. The tool says so in the argument descriptions rather than returning a silently short list. +### There is no working domestic-only engine set + +Stated plainly because it was measured, not assumed. Every general-web index +SearXNG ships for China was added to `keep_only`, the container was restarted, +and each was measured over 5 runs per query: + +| Engine | en hits | zh hits | Outcome | +| --- | --- | --- | --- | +| `360search` | 5/5 | 5/5 | Reliable, 0% relevant | +| `quark` | 0/5 | 0/5 | Rate-limited dead after two good responses | +| `baidu` | — | 0 | CAPTCHA, 1-hour IP suspension | +| `sogou` | — | 0 | Upstream `AttributeError` | +| `baidu kaifa` | — | 0/10 | A **code** index: matches "opencode v2" as OpenCV2 and returns CSDN blog posts | +| `bilibili` | — | — | Video titles, not a web index | +| `chinaso news` | — | — | Falls through to the default engine set | +| `brave`, `duckduckgo`, `google`, `qwant`, `wikipedia` | 0 | 0 | Unreachable from this network | +| `mojeek`, `startpage` | — | — | Not present in this SearXNG release | + +`quark` is the trap. On its first two requests it returned the exact article +being asked about as result #1 on both queries — better than anything else +measured here — and then went permanently dark. Do not reinstate it on the +strength of a first impression. + +`cn.bing.com` is the only dependable endpoint, and it is a China-hosted Bing, +so `bing` serves as the domestic option. Its one real limitation is that it +ignores the `site:` operator completely: `site:opencode.ai v2 migration` returns +0 results from opencode.ai, while the same query without `site:` returns 3. +Site-restricted search is not available through this instance — fetch the docs +index and follow links instead. + ## Troubleshooting | Symptom | Check | diff --git a/plugins/searxng-search/index.ts b/plugins/searxng-search/index.ts index 5552a3a..7a4014b 100644 --- a/plugins/searxng-search/index.ts +++ b/plugins/searxng-search/index.ts @@ -42,8 +42,32 @@ const DEFAULT_BASE_URL = process.env.SEARXNG_URL ?? "http://127.0.0.1:39217" // the first round of noise in this plugin's history came from. // // naver is strong on English but returns 0/9 on Chinese, so it is left out -// rather than allowed to dilute Chinese queries. baidu stays out entirely: it -// answers with a CAPTCHA and suspends the client IP for an hour. +// rather than allowed to dilute Chinese queries. +// +// A domestic-only engine set was tried and there is no working one on this +// network. Every general-web index SearXNG ships for China was added to +// keep_only, restarted, and measured over 5 runs per query: +// +// engine en hits zh hits result +// 360search 5/5 5/5 4-5 results, 0% relevant +// quark 0/5 0/5 11/11 relevant twice, then rate-limited dead +// baidu - 0 CAPTCHA, suspends the client IP for an hour +// sogou - 0 upstream AttributeError, searx/engines/sogou.py:56 +// baidu kaifa - 0/10 code index: matches "opencode v2" as OpenCV2 +// bilibili - - video titles, not a web index +// chinaso news - - falls through to the default engine set +// +// quark is the one that looked like a fix. It returned the exact article being +// asked about as result #1 on both queries, then answered 0 results on 5 +// consecutive runs of each. Do not put it back in the default on the strength +// of a first request. +// +// cn.bing.com is the only reliably useful endpoint, and it is a China-hosted +// Bing, so `bing` counts as the domestic option here. Its one real limitation +// is that it ignores the `site:` operator entirely. +// +// baidu stays out entirely: it answers with a CAPTCHA and suspends the client +// IP for an hour, which would break every search that touches it. const DEFAULT_ENGINES = "bing,yandex" const DEFAULT_TIMEOUT_MS = 20_000