OpenObserve非sql模式 query editor 中 xx like ‘|’报错如何处理

您提到的行为是 OpenObserve ​非 SQL 模式下 Query Editor 中的核心特性。让我们明确问题原因和解决方案:


⚠️ 报错原因:| 是条件分隔符

在 ​非 SQL 模式的 Query Editor 中:

  1. **| 是逻辑操作符**:表示 OR 条件(不是普通字符)。
  2. 输入结构被破坏 :当您输入 xx like '|' 时:
    • xx like 会被识别为一个查询条件
    • 后面的 '|' 会被解析器拆解:
      • 单引号 ' 是字符串边界符
      • 竖线 | 被识别为新条件的开始 → 解析器期待紧随其后的是另一个字段名(如 _timestamplevel),而非单引号或空内容。
    • 结果 :查询语法结构断裂,导致类似 Unexpected token '|' 的错误。

✅ 解决方案:使用 ​字段值模式 ​ 或 ​转义

方案 1️⃣:​字段值模式(推荐)​

适用场景:精确查找仅含 | 的字段值

  1. 在 Query Editor 中:
    • 选择字段(如 msg

    • 运算符选 = (精确匹配)或 contains(模糊匹配)

    • **值输入框输入竖线 |**(加引号)

      msg = | // 精确匹配字段值为竖线"|"的日志

      msg contains | // 匹配包含竖线的日志(如 "Error | timeout")

方案 2️⃣:​强制转义为普通字符

适用场景:作为复杂字符串的一部分

在查询条件的值输入框内,​使用反斜杠 \ 转义竖线:

复制代码
msg contains \|   // 匹配包含"|"的日志(被识别为普通字符)

msg = \|          // 精确匹配值为竖线"|"的日志
方案 3️⃣:​切换到 SQL 模式

若非 SQL 模式无法满足,直接切换为 SQL 语法模式:

复制代码
SELECT * FROM 'stream_name' 
WHERE msg LIKE '%|%'    -- 需转义则写 '%= \| =%'

📝 非 SQL 模式下的正确写法示例

场景 错误写法 正确写法 解析结果
查找 msg 仅为竖线 ` ` `msg like ' '`
查找含 ` msg` `msg like '% %'`
查找以 `A 开头的msg` `msg like 'A %'`

🔍 技术原理

OpenObserve 非 SQL 模式的 Query Editor ​动态解析用户输入​:

  • **竖线 |** 始终被识别为逻辑 OR 的分隔符
  • 值输入框的内容 (除非转义)会直接按字符串处理,但引号内结构有破坏风险
  • **转义符号 \** 显式声明:下一个字符是普通文本,非运算符。

💎 总结

在 ​非 SQL 模式中:

  1. 不能 直接在 like 值里写 | → 会被识别为逻辑 OR 导致结构错误。
  2. 两种安全写法
    • 模糊匹配 → 用 字段 contains \|
    • 精确匹配 → 用 字段 = \|
  3. 值输入框内无需加引号('"),系统会自动处理字符串边界。