Skip to content

fix(slash-command): 斜杠命令匹配改为打分式模糊排序 - #167

Open
rayn1314 wants to merge 1 commit into
lehhair:mainfrom
rayn1314:fix/slash-command-fuzzy-match
Open

rayn1314 wants to merge 1 commit into
lehhair:mainfrom
rayn1314:fix/slash-command-fuzzy-match

Conversation

@rayn1314

Copy link
Copy Markdown
Contributor

用 OpenCodeUI 桌面端的时候,斜杠命令的匹配一直让我很抓狂,实在忍不住来修一下。

遇到的问题

想打 /goal,敲到 /goa 了,第一个候选还是 /review-work,goal 排在后面;想打 /compact/comp 甚至 /compa 都还没看到 compact,前面全是一堆名字完全不沾边的 skill。基本上要快把命令打完了,它才肯把我要的匹配出来。

排查

问题在 src/features/slash-command/SlashCommandMenu.tsx,过滤逻辑其实就一行:

commands.filter(cmd => cmd.name.includes(query) || cmd.description.includes(query))

总结下来三个毛病:

  1. 只会「连续子串」匹配,没有前缀优先,也不认缩写,所以 cmp 永远匹配不到 compact
  2. 结果完全不排序,顺序就是后端返回的原始顺序,谁在前全看运气;
  3. 命令名和描述权重一样,skill 的长描述里只要碰巧出现 "comp"、"goal" 这种词,就能把正主挤到后面甚至挤没。

修复

写了一个打分式模糊匹配(新增 src/utils/fuzzyMatch.ts),按相关度分级打分再排序:

名字全等 > 名字前缀 > 名字词边界(如 stats 命中 session-stats)> 名字子串 > 名字缩写子序列(cmpcompact)> 描述命中

关键点是:名字只要沾边,就一定排在「仅描述命中」前面,这样再长的 skill 描述也抢不走 /compact/goal 的位置。空输入时保持原来的列表顺序,键盘上下键、回车选中的交互都没动。

另外补了核心契约测试,把上面这些场景(前缀优先、缩写命中、描述不抢名字、乱序/无关词不匹配)都固定住。

验证

  • typecheck 0 错误,改动文件 ESLint 0 问题,src/ 测试 606/606 通过,build 成功;
  • 修复后实测:打第一个字母时目标命令就已经排在第一项了,/cmp 这种缩写也能提前搜到。

哪里写得不对欢迎指出。

- 新增打分式模糊匹配工具,按「名字全等 > 前缀 > 词边界 > 子串 > 缩写子序列 > 描述命中」分级评分
- 名字命中权重恒定高于描述命中,避免描述里碰巧含关键词的 skill 抢占排序
- 斜杠命令菜单过滤由连续子串匹配改为按相关度打分排序,缩写(如 cmp 命中 compact)也能提前匹配
- 空查询时保持命令原始顺序,键盘导航与既有交互不变
- 补充核心契约测试,覆盖前缀优先、缩写命中、描述不抢名字、乱序与无关词不匹配
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant