feat: apply Unicode normalization to search so NFD, final sigma and fullwidth text match

该问题发生在 Open WebUI 的聊天搜索中,当标题和查询词使用不同的 Unicode 编码(如 NFC/NFD、希腊语词尾 sigma、全角字符)时,搜索返回 0 结果。优先排查你使用的 Unicode 编码形式,并确认是否已升级到包含大小写折叠(case folding)修复的 dev 分支

快速结论:该问题发生在 Open WebUI 的聊天搜索中,当标题和查询词使用不同的 Unicode 编码(如 NFC/NFD、希腊语词尾 sigma、全角字符)时,搜索返回 0 结果。优先排查你使用的 Unicode 编码形式,并确认是否已升级到包含大小写折叠(case folding)修复的 dev 分支版本。

适用环境:Open WebUI v0.11.1(Pip 安装),macOS Sequoia,Brave 1.92 浏览器;Ollama 不适用(n/a)。SQLite 和 PostgreSQL 16 均已复现,但未确认具体 Python/PyTorch/CUDA 版本。

最快修复方案:暂无确认的一步修复方案。Issue 报告时(v0.11.1)存在缺陷,但维护者表示针对非 ASCII 字符的大小写折叠修复已合并到 dev 分支;若你使用的版本较旧,升级到包含该修复的最新 dev 构建是优先尝试的方向。

注意事项:NFC/NFD 归一化和全角字符折叠与此不同,维护者明确表示这是产品决策而非缺陷修复,暂无时间表。在修复可用前,从 Finder 粘贴分解(NFD)文本到标题后,唯一可靠的方法是重新用键盘输入标题文本。

问题场景

用户在 Open WebUI 中搜索聊天标题。触发场景为:标题中包含的文本与搜索关键词使用不同的 Unicode 编码形式——例如从 macOS Finder 复制文件名(通常为 NFD 分解形式)粘贴为聊天标题,而在搜索框中手动输入相同文字(通常为 NFC 组合形式)。此外还包括希腊语词尾 sigma 变体(U+03C2 ς vs U+03C3 σ)以及全角字符(如 “Luka” vs “Luka”)的匹配失败。

报错原文

feat: apply Unicode normalization to search so NFD, final sigma and fullwidth text match

0 results. Nothing in the search path normalizes either side: SQLite's builtin lower() does not normalize, Python str.lower() does not normalize, and PostgreSQL's lower()/ILIKE does not normalize either (also reproduced on PostgreSQL 16, see the PostgreSQL check in Steps to Reproduce), so this is not SQLite-specific. The comparison runs on raw codepoint sequences and the two spellings never meet.

原因分析

根本原因是搜索路径中的字符串比较基于原始码点序列,而数据库和 Python 的内置 lower() 函数均不执行 Unicode 归一化。具体表现为:

已确认原因:

  • SQLite、PostgreSQL 和 Python 的 lower() 只处理 ASCII 大小写,不执行 Unicode 归一化(NFC/NFD)或大小写折叠(case folding)。
  • 针对非 ASCII 字符(如 ŁĄKA、西里尔字母)的大小写不敏感搜索缺陷,维护者已在 dev 分支修复,但在 v0.11.1 中仍存在。
  • 希腊语词尾 sigma 问题:Python str.lower(‘ΣΑΣ’) 生成词尾形 U+03C2 ς,而 SQLite lower() 不处理 sigma 变体;Unicode casefold 规则可同时映射两种 sigma 到 U+03C3 σ,但搜索路径未实现。

可能原因(产品决策,非缺陷):

  • NFC/NFD 归一化未实现,因为兼容性折叠可能产生意外匹配(如 ㎡ 匹配 m2、① 匹配 1),维护者视为产品决策而非缺陷。
  • 全角字符折叠同样属于此范畴,不在修复时间表内。

环境排查

  • 确认 Open WebUI 版本:v0.11.1 已知受影响;升级到包含大小写折叠修复的 dev 分支后,非 ASCII 大小写问题可能已解决。
  • 确认数据库类型:SQLite(默认)和 PostgreSQL 16 均已复现,问题与数据库无关。
  • 检查剪贴板文本编码:运行 pbpaste | python3 -c "import sys, unicodedata; s = sys.stdin.read(); print(unicodedata.is_normalized('NFC', s))",输出 False 表示剪贴板文本为 NFD。
  • 验证搜索目标字符类型:区分是大小写问题(已修复)还是归一化/全角问题(未修复)。

解决步骤

  1. 升级到最新 dev 分支或包含相关修复的发布版本:Issue 维护者确认“Case folding for non-ASCII landed in dev this morning”——非 ASCII 字符(如 ŁĄKA、西里尔文)的大小写匹配已在 dev 修复,升级后验证这些场景。
  2. 使用 Python 验证 clip 文本的归一化形式:执行 pbpaste | python3 -c "import sys, unicodedata; s = sys.stdin.read(); print(unicodedata.is_normalized('NFC', s))",判断粘贴文本是否为 NFC 标准形式。
  3. 针对希腊语词尾 sigma:这是维护者认为值得修复的场景,但未确认是否已包含在 dev 修复中。可优先尝试升级版本后再测试。
  4. 针对 NFC/NFD 和全角:维护者明确说明这是产品决策,无时间表。在修复前,唯一可行方法是:手动重新输入标题文本(而不是粘贴)以确保使用 NFC 编码。
  5. 如果使用旧版本且无法升级:可尝试在搜索框中输入与标题完全相同的字节序列(即复制标题文本进行搜索),而不是手动输入。

验证方法

在升级到最新 dev 版本后,创建包含以下内容的聊天标题并验证搜索匹配性:

  • 非 ASCII 大小写:标题 “ŁĄKA”,搜索 “łąka”(此场景在 dev 中已修复)。
  • 希腊语词尾 sigma:标题 ‘ΣΑΣ ΣΥΜΒΑΣΗ γραμμή’,分别用两种 sigma 变体搜索。
  • NFC/NFD:从 Finder 复制文件名的分解(NFD)文本粘帖为标题,再手动输入相同 NFC 文本搜索——预期仍不匹配(未修复)。

参考来源

open-webui/open-webui #29210

GamsGo AI

AI 工具推荐

想把多个 AI 模型放在一个入口?

GamsGo AI 集成 ChatGPT、DeepSeek、Gemini、Claude、Midjourney、Veo 等常用模型,适合写作、绘图、视频和日常 AI 工作流。

了解 GamsGo AI

推广链接:通过此链接购买,我可能获得佣金,不影响你的价格。

这个方案解决了吗?

celebrityanime
celebrityanime
文章: 21219

发表回复

您的邮箱地址不会被公开。 必填项已用 * 标注