跳转至

分词规则


在 Doris 存储引擎下,queryString 函数基于全文索引进行匹配,其语义与分词结果直接相关。观测云底层分词器遵循 Unicode Standard Annex #29默认词边界(Default Word Boundaries)规范,将文本拆分为独立的词项(Token)后进行索引和查询。


词边界判定逻辑

UAX #29 通过一组规则(WB1–WB999)判定两个相邻字符之间是否产生词边界。核心规则如下:

  • WB5:字母(ALetter)之间不产生边界,如 hello 视为一个词项;
  • WB6 / WB7:字母 + 特定标点(MidLetterMidNumLet)+ 字母,不产生边界,如 example.comhandlepongmessage:devops 视为一个词项;
  • WB8 / WB9 / WB10:数字之间、字母与数字之间不产生边界,如 32.3 中的 323 视为数字序列(. 作为 MidNumLet 不打破数字边界);
  • WB13a / WB13b:下划线(ExtendNumLet)与字母/数字之间不产生边界,如 user_name 视为一个词项;
  • WB999:不符合上述规则的其他情况,均产生词边界

分隔符(产生词边界)

以下字符在分词器中被视为分隔符,会在其前后产生词边界,查询时会被拆分为独立词项:

字符 Unicode 属性 说明 示例(原始文本 → 分词结果)
(空格) White_Space / WSegSpace 基本分隔符 hello worldhello, world
/ Other URL 路径分隔符 http://example.com/pathhttp, example.com, path
? Other URL 查询参数起始符 ?query=1query, 1
= Other 键值对分隔符 key=valuekey, value
& Other URL 参数连接符 a=1&b=2a, 1, b, 2
@ Other 邮箱分隔符 user@example.comuser, example.com
注意

以上字符在 queryString 查询中若需作为字面量匹配,建议使用转义或引号包裹;但由于分词阶段即被移除,即使使用引号包裹,底层索引仍以分词后的词项进行匹配。


词项组成部分(不产生词边界)

以下字符在分词器中被视为词项的一部分,不会在其前后产生词边界:

字符 Unicode 属性 说明 示例
.(点号) MidNumLet 域名、标识符的一部分 example.com 视为一个词项
_(下划线) ExtendNumLet 标识符的一部分 user_name 视为一个词项
:(冒号) MidLetter 命名空间、标识符的一部分 handlepongmessage:devops 视为一个词项

分词示例

示例 1:URL 分词

原始文本:

https://api.example.com/v1/users?id=123&name=test

分词结果(仅保留有效词项):

https, api.example.com, v1, users, id, 123, name, test

示例 2:邮箱地址分词

原始文本:

admin@example.com

分词结果:

admin, example.com

示例 3:下划线标识符

原始文本:

user_name = "Alice"

分词结果:

user_name, Alice

示例 4:冒号分隔的标识符

原始文本:

handlepongmessage:devops

分词结果:

handlepongmessage:devops

对查询的影响

理解分词规则有助于编写更精确的 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 的文档 / 是分隔符

注意事项

短语查询的局限性

双引号用于精确短语匹配,要求词项在索引中相邻出现。但由于分隔符(如 @/= 等)在分词阶段已被移除,短语查询无法区分原始文本中的具体分隔符。例如:

queryString("user@example.com")

实际匹配的是 userexample.com 两个词项相邻出现,可能同时匹配 user@example.comuser example.com 等文本。如需严格匹配包含 @ 的原始字符串,建议改用 matchregexp 函数。

中文分词

对于中文、日文等 CJK 字符,UAX #29 默认规则按字符切分(每个字视为独立词项),与 search 函数的「中文:按字符分词匹配」行为一致。

大小写敏感

queryString 匹配默认不区分大小写。


文档评价

文档内容是否对您有帮助? ×