分词规则¶
在 Doris 存储引擎下,queryString 函数基于全文索引进行匹配,其语义与分词结果直接相关。观测云底层分词器遵循 Unicode Standard Annex #29 的默认词边界(Default Word Boundaries)规范,将文本拆分为独立的词项(Token)后进行索引和查询。
词边界判定逻辑¶
UAX #29 通过一组规则(WB1–WB999)判定两个相邻字符之间是否产生词边界。核心规则如下:
- WB5:字母(
ALetter)之间不产生边界,如hello视为一个词项; - WB6 / WB7:字母 + 特定标点(
MidLetter、MidNumLet)+ 字母,不产生边界,如example.com、handlepongmessage:devops视为一个词项; - WB8 / WB9 / WB10:数字之间、字母与数字之间不产生边界,如
32.3中的32和3视为数字序列(.作为MidNumLet不打破数字边界); - WB13a / WB13b:下划线(
ExtendNumLet)与字母/数字之间不产生边界,如user_name视为一个词项; - WB999:不符合上述规则的其他情况,均产生词边界。
分隔符(产生词边界)¶
以下字符在分词器中被视为分隔符,会在其前后产生词边界,查询时会被拆分为独立词项:
| 字符 | Unicode 属性 | 说明 | 示例(原始文本 → 分词结果) |
|---|---|---|---|
␣(空格) |
White_Space / WSegSpace |
基本分隔符 | hello world → hello, world |
/ |
Other |
URL 路径分隔符 | http://example.com/path → http, example.com, path |
? |
Other |
URL 查询参数起始符 | ?query=1 → query, 1 |
= |
Other |
键值对分隔符 | key=value → key, value |
& |
Other |
URL 参数连接符 | a=1&b=2 → a, 1, b, 2 |
@ |
Other |
邮箱分隔符 | user@example.com → user, example.com |
注意
以上字符在 queryString 查询中若需作为字面量匹配,建议使用转义或引号包裹;但由于分词阶段即被移除,即使使用引号包裹,底层索引仍以分词后的词项进行匹配。
词项组成部分(不产生词边界)¶
以下字符在分词器中被视为词项的一部分,不会在其前后产生词边界:
| 字符 | Unicode 属性 | 说明 | 示例 |
|---|---|---|---|
.(点号) |
MidNumLet |
域名、标识符的一部分 | example.com 视为一个词项 |
_(下划线) |
ExtendNumLet |
标识符的一部分 | user_name 视为一个词项 |
:(冒号) |
MidLetter |
命名空间、标识符的一部分 | handlepongmessage:devops 视为一个词项 |
分词示例¶
示例 1:URL 分词¶
原始文本:
分词结果(仅保留有效词项):
示例 2:邮箱地址分词¶
原始文本:
分词结果:
示例 3:下划线标识符¶
原始文本:
分词结果:
示例 4:冒号分隔的标识符¶
原始文本:
分词结果:
对查询的影响¶
理解分词规则有助于编写更精确的 queryString 查询:
| 查询语句 | 实际匹配逻辑 | 说明 |
|---|---|---|
queryString("example.com") |
匹配包含 example.com 词项的文档 |
点号属于词项一部分 |
queryString("user_name") |
匹配包含 user_name 词项的文档 |
下划线属于词项一部分 |
queryString("user@example") |
匹配包含 user 或 example 的文档 |
@ 是分隔符,查询被拆分为两个词项,默认按 OR 连接 |
queryString("id=123") |
匹配包含 id 或 123 的文档 |
= 是分隔符 |
queryString("a/b") |
匹配包含 a 或 b 的文档 |
/ 是分隔符 |
注意事项¶
短语查询的局限性¶
双引号用于精确短语匹配,要求词项在索引中相邻出现。但由于分隔符(如 @、/、= 等)在分词阶段已被移除,短语查询无法区分原始文本中的具体分隔符。例如:
实际匹配的是 user 和 example.com 两个词项相邻出现,可能同时匹配 user@example.com 和 user example.com 等文本。如需严格匹配包含 @ 的原始字符串,建议改用 match 或 regexp 函数。
中文分词¶
对于中文、日文等 CJK 字符,UAX #29 默认规则按字符切分(每个字视为独立词项),与 search 函数的「中文:按字符分词匹配」行为一致。
大小写敏感¶
queryString 匹配默认不区分大小写。