Elasticsearch中的Normalizers(规范化器)深度解析

Elasticsearch中的Normalizers(规范化器)深度解析

elasticsearch elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch

什么是Normalizers

Normalizers(规范化器)是Elasticsearch中一种特殊的文本处理工具,它与分析器(Analyzer)类似但更为精简。Normalizers主要用于处理不需要分词(tokenization)的场景,它只能输出单个token,这使得它特别适合用于keyword类型字段的预处理。

与完整分析器相比,Normalizers有以下关键区别:

  1. 不能包含tokenizer(分词器)
  2. 只能使用特定的字符过滤器(char filters)和token过滤器(token filters)
  3. 输出结果始终是单个token

Normalizers的核心组件

可用的字符过滤器

Normalizers支持使用字符过滤器对原始文本进行预处理,例如:

  • 特殊字符转换(如将«»转换为引号)
  • Unicode字符规范化

可用的token过滤器

由于Normalizers只能输出单个token,因此只能使用基于单个字符操作的过滤器,包括:

  • lowercase:转换为小写
  • asciifolding:将非ASCII字符转换为ASCII近似字符
  • trim:去除前后空格
  • uppercase:转换为大写
  • 各种语言的规范化过滤器(如german_normalizationhindi_normalization等)

注意:像词干提取(stemming)这类需要查看整个单词的过滤器不能用于Normalizers。

内置Normalizers

Elasticsearch默认提供了一个内置的lowercase规范化器,它会将文本转换为小写形式。对于更复杂的需求,需要自定义Normalizers。

自定义Normalizers实战

下面通过一个完整示例展示如何创建和使用自定义Normalizer:

PUT index
{
  "settings": {
    "analysis": {
      "char_filter": {
        "quote": {
          "type": "mapping",
          "mappings": [
            "« => \"",
            "» => \""
          ]
        }
      },
      "normalizer": {
        "my_normalizer": {
          "type": "custom",
          "char_filter": ["quote"],
          "filter": ["lowercase", "asciifolding"]
        }
      }
    }
  },
  "mappings": {
    "properties": {
      "foo": {
        "type": "keyword",
        "normalizer": "my_normalizer"
      }
    }
  }
}

这个示例中:

  1. 首先定义了一个字符过滤器quote,将法语引号«»转换为标准引号
  2. 然后创建了一个名为my_normalizer的自定义Normalizer,它:
    • 使用quote字符过滤器
    • 依次应用lowercaseasciifolding过滤器
  3. 最后在映射中将这个Normalizer应用于foo字段

典型应用场景

Normalizers特别适用于以下场景:

  1. 关键字规范化:确保存储和搜索时使用统一格式(如统一大小写)
  2. 标识符处理:处理产品代码、用户名等不需要分词的字段
  3. 多语言支持:处理不同语言的特殊字符规范化
  4. 数据清洗:统一不同来源数据的格式

最佳实践建议

  1. 对于需要精确匹配但不分词的字段,优先考虑使用Normalizer而非Analyzer
  2. 保持Normalizer的简单性,避免过多处理步骤
  3. 测试Normalizer效果时,可以使用_analyzeAPI进行验证
  4. 考虑性能影响,复杂的字符转换可能影响索引速度

通过合理使用Normalizers,可以显著提升Elasticsearch中关键字字段的搜索质量和一致性,同时保持高效的查询性能。

elasticsearch elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

邵瑗跃Free

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值