
workflow app logs search chinese failed
快速结论:该错误发生在 Dify 工作流日志搜索中,当用户输入中文关键词时无法匹配到已存储的记录。优先排查是否使用了 Dify v1.11.0 及以上版本,并检查数据库记录中中文字符是否以 \uXXXX 格式存储。
问题场景
用户在执行 Dify 工作流(Workflow)时,创建了工作流运行日志。之后在日志搜索功能中输入中文关键词(如“中文”)进行检索,但无法返回匹配的结果。该场景下 Dify 版本为 1.14.2,使用 Docker 方式自托管部署。
报错原文
workflow_run.inputs = json.dumps(json_converter.to_json_encodable(execution.inputs))
# 中文 store as \u4e2d\u6587
# search with LIKE pattern
keyword_like_val = f"%{escaped_keyword}%"
WorkflowRun.inputs.ilike(keyword_like_val, escape="\\")
# keyword match failed
原因分析
该问题由 PR #30450 引入(合并到 v1.11.0 版本)。该 PR 重构了 LIKE 模式转义逻辑用于安全防护,但移除了之前用于匹配存储在数据库中的 \uXXXX 格式中文字符的 unicode_escape 编码转换。
核心机制:json.dumps() 默认参数 ensure_ascii=True,导致中文字符(如“中文”)被存储为 \u4e2d\u6587 等 Unicode 转义序列。旧代码在搜索前会将关键词也转换为相同的转义格式后再执行查询,而新的 escape_like_pattern() 函数只处理 LIKE 通配符(%、_、\)的转义,但未执行 unicode-escape 转换,导致原始中文字符关键词无法匹配存储的 \uXXXX 序列。
环境排查
- Dify 版本:检查是否 >= v1.11.0(问题由此版本引入)
- 数据库内容:检查
workflow_run表中inputs和outputs字段,确认中文字符是否以\uXXXX格式存储 - 部署方式:Docker 或源码部署均可复现
解决步骤
- 方案一(可优先尝试):在搜索路径中恢复 unicode-escape 转换。在构建 LIKE 模式之前,将关键词执行
.encode('unicode_escape').decode('utf-8')转换(即恢复到 v1.11.0 之前的行为)。 - 方案二(长期推荐):修复序列化存储方式。在
json.dumps()调用时添加参数ensure_ascii=False,使中文字符直接以原始字符形式存储到数据库中。注意此方案需要对已有记录执行数据迁移。 - 具体修改位置:参考 Issue #37367 中的根因分析,定位到
libs/helper.py中的escape_like_pattern函数以及存储inputs/outputs的相关代码。
验证方法
在修复后,重新发起工作流日志搜索:
- 输入中文关键词(如“中文”),确认搜索结果能匹配到对应记录。
- 检查 SQL 查询日志,确认 LIKE 子句中的关键词已被正确编码。
- 对于方案二,检查新创建的记录中
inputs/outputs字段是否直接存储原始中文字符而非\uXXXX序列。
参考来源
根因分析详见:langgenius/dify #37367



