ICU 归一化字符过滤器(ICU Normalizer)

ICU Normalizer 字符过滤器 #

icu_normalizer 字符过滤器使用 ICU 库在分词之前对原始文本进行 Unicode 归一化。它可以将字符的多种编码形式统一为标准形式,确保相同的"视觉字符"在搜索时能够匹配。

需要插件:此过滤器由 analysis-icu 插件提供,Easysearch 默认已集成。

与词元过滤器版本的区别 #

ICU 插件同时提供了字符过滤器和词元过滤器两个版本:

版本类型名处理阶段适用场景
字符过滤器icu_normalizer分词前需要在分词前统一字符形式
词元过滤器icu_normalizer分词后只需对词元进行归一化

建议:大多数场景使用字符过滤器版本效果更好,因为归一化发生在分词之前,可以避免因字符形式不同导致的分词差异。

参数说明 #

参数类型默认值说明
nameStringnfkc_cfUnicode 归一化方式,见下方选项
modeStringcompose归一化模式:compose(合成)或 decompose(分解)
unicode_set_filterString可选,ICU UnicodeSet 过滤条件,仅对匹配字符进行归一化

name 可选值 #

说明
nfcNFC 标准归一化(合成优先)
nfkcNFKC 兼容归一化(合成优先)
nfkc_cf默认值。NFKC 归一化 + Case Folding(大小写折叠)

使用示例 #

基本用法(默认 nfkc_cf) #

PUT /my-icu-index
{
  "settings": {
    "analysis": {
      "analyzer": {
        "my_icu_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "char_filter": ["icu_normalizer"]
        }
      }
    }
  }
}

自定义归一化方式 #

PUT /my-icu-index
{
  "settings": {
    "analysis": {
      "char_filter": {
        "my_icu_normalizer": {
          "type": "icu_normalizer",
          "name": "nfc",
          "mode": "compose"
        }
      },
      "analyzer": {
        "my_analyzer": {
          "type": "custom",
          "tokenizer": "standard",
          "char_filter": ["my_icu_normalizer"]
        }
      }
    }
  }
}

测试效果 #

GET /_analyze
{
  "tokenizer": "keyword",
  "char_filter": ["icu_normalizer"],
  "text": "Ⅲ fi ℃"
}

归一化结果:iiifi°c(NFKC 兼容分解 + case folding)。

典型归一化效果 #

输入nfkc_cf 输出说明
iii罗马数字分解
fi连字分解
a全角→半角 + 小写
é(2 码点)é(1 码点)组合字符合成
km兼容字符分解

适用场景 #

  • 多语言索引:统一不同 Unicode 编码的相同字符
  • 全角/半角混合:日语、中文文本中的全角字母和数字
  • 连字与特殊符号:学术文本中的 fi、fl、℃ 等
  • 组合字符:变音符号的合成/分解统一