composer search 找不到中文关键词是因为 packagist 索引仅处理英文 token,中文 description 和 keywords 被丢弃或转为空,搜索依赖 name、description、keywords 的英文元数据,readme 中文内容不参与索引。

Composer 官方不支持中文搜索,Packagist 也不对中文包名、中文描述或 README 中的中文内容建立倒排索引——这不是配置问题,是设计决定。
为什么 composer search 找不到中文关键词
Composer CLI 的 search 命令只查询 Packagist API 的 /search.json 接口,该接口仅匹配以下字段的英文 token:
-
name(强制小写、仅 ASCII 字母/数字/-/_) -
description(被预处理为英文分词,中文字符直接丢弃) -
keywords(要求是英文单词数组,中文字符串会被忽略)
即使你在 composer.json 里写 "description": "这是一个日志工具",Packagist 抓取后存入索引的仍是空 description 字段——它用的是 ext-intl 的 transliterator_transliterate('Any-Latin; NFD; [:Nonspacing Mark:] Remove; NFC') 规则,对纯中文返回空字符串。
想让中文用户搜到你的包?只能靠英文元数据
真正起作用的不是 README 里的中文说明,而是你主动维护的英文字段。实操上必须做三件事:
围绕关键发现、作用机制、临床相关性及研究局限性展开讨论。适用于撰写或优化任何生物医学论文的“讨论(Discussion)”部分——包括结果解读、与既往文献关联、阐释意外发现、界定研究局限性,以及撰写结论。当用户输入以下任一指令时也会自动触发该功能: - “write my discussion” - “help me discuss my findings” - “how do I compare to prior studies” - “write the limitations par
- 把包名保持全英文(如
laravel-china/log-helper,而非laravel-china/日志助手) -
description字段写简明英文(如"A Laravel log utility with rotation and level filtering") -
keywords显式填英文术语(如["laravel", "log", "monolog", "rotation"]),不要留空或填中文
Packagist 每次收到 webhook 或手动 reindex 请求时,会重新解析 composer.json 并更新这些字段;它不会扫描 README.md 或其他文件内容。
packagist.org 网页搜索和 API 是同一套索引
网页上搜 log 和执行 composer search log 走的是同一个后端索引服务(Elasticsearch),没有额外中文支持层。常见误解包括:
- 以为在 Packagist 页面输入中文能触发模糊匹配 → 实际返回空结果(HTTP 200 +
{"results":[]}) - 以为开启
"archive": {"format": "zip"}会影响索引 → 完全无关,归档配置只影响安装阶段 - 以为提交 PR 到 packagist/packagist 仓库能启用中文搜索 → 该项目已归档,所有索引逻辑现由 private infra 控制,不接受外部 PR
目前唯一绕过限制的方式是:在自己的文档站或 GitHub Wiki 里建一份手工维护的中文包映射表,把中文关键词指向对应英文包名 —— 这不属于 Composer 生态链路,但对国内团队最实际。
真正卡住的点从来不是技术实现难度,而是 Packagist 把「包可发现性」完全绑定在英文元数据质量上,而很多中文作者默认跳过这步。一个 composer.json 里没填 keywords 的包,无论 README 写得多详细,对全球搜索来说就是不存在的。










