### 2.1. Search for authors by name `GET /graph/v1/author/search` 按姓名检索作者。 | 参数 | 必填 | 说明 | |---|---|---| | `query` | 是 | 纯文本姓名 | | `offset` / `limit` | 否 | `limit` 默认 100、上限 1000 | | `fields` | 否 | 逗号分隔的字段投影,见 §3 | ```bash curl "https://fetchpaper.com/graph/v1/author/search?query=Vaswani&limit=2&fields=name,paperCount,citationCount,hIndex" ``` ```json {"total": 58, "offset": 0, "next": 2, "data": [{"authorId": "40348417", "name": "Ashish Vaswani", "paperCount": 50, "citationCount": 218026, "hIndex": 25}, {"authorId": "1751096", "name": "Namrata Vaswani", "paperCount": 159, "citationCount": 4867, "hIndex": 35}]} ``` - `/author/search` 把连字符当**普通分隔符**:`Smith-Jones` 拆成 `smith` + `jones` 求交集,实测 `total: 4` (首位 `Katherine Jones-Smith`);`Bo-Kai Cao` 实测 `total: 3`,全名完全相等那位排第一。缩写式 `J.-P.` 同理,实测 6,961 条。本地 14,005,627 位作者里 1,830,802 位(13.1%)姓名带 `词-词` 连字符,都能按全名查到。 命中数与官方不同只是**语料范围**差异(官方全库、本地 CS 子集),不是匹配规则差异。 - **两种非 200 分得很开(口径见 §0):数据没建 → 500,查询太宽 → 400。** 作者数据没建时五个 `/author/*` 端点全部 500,文案 `作者表缺失或不完整,运行 python build_authors.py 重建`;只有姓名检索索引单独缺失时 影响面小一档:**只有** `/author/search` 500,文案换成 `作者姓名索引缺失或规范化版本不一致,运行 python build_authors.py 重建`, `/author/{id}`、`/author/{id}/papers`、`/author/batch` 照常 200。作者数据缺失也不牵连论文侧: `/paper/{id}/authors` 的名字来自论文正文,照常 200,只是画像字段给空值。 - **`/author/search` 查询规模也有界**,超限一律 400 + JSON,不 500、不半帧: - 单个词的前缀展开 **60,000 个姓名项 / 5,000,000 行**,谁先撞到报谁(模板,尖括号换实际值): `Name prefix matches too many entries ( terms / postings scanned, max 60,000 terms or 5,000,000 postings); use a longer query`。 真库最宽的两字母前缀是 `ma`(51,994 个词),所以**真实姓名查不出这一条**,它是给畸形入参兜底的。 - 一条查询(去重后)各词命中行数之和 **8,000,000 行**: `Name query scans too many author entries (8,004,812 postings, max 8,000,000); use fewer or rarer name tokens`。 上一条管「一个前缀有多大」,这条管「几个宽前缀叠起来有多大」——姓名词之间是**交集**(AND), 十个各自合法的宽前缀仍是十份扫描。真库实测 `li ch zh ma sh ji ha xi wa ya sa yu mi hu ka pa` = 7,722,421 行(200), 再加一个 `we` 就是 8,004,812 行 → 400;最宽的真实姓名组合 `smith wang li` 是 1,112,693 行,远在界内。 - **同一个词写几遍只算一遍**(交集对自己幂等,去重不改结果也不改顺序)。查不到的词不花钱——第一个空结果 就短路,所以 4,096 个生词仍是 200 / 17 ms(预算不是按词个数算的)。 - 再往外是 transport 的界:请求行超过 stdlib 64 KB 上限回 **414**(实测 8,192 个词 ≈ 74 KB → 414, 4,096 个 ≈ 37 KB → 200)。