Elasticsearch中的Normalizers(规范化器)深度解析
elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch
什么是Normalizers
Normalizers(规范化器)是Elasticsearch中一种特殊的文本处理工具,它与分析器(Analyzer)类似但更为精简。Normalizers主要用于处理不需要分词(tokenization)的场景,它只能输出单个token,这使得它特别适合用于keyword类型字段的预处理。
与完整分析器相比,Normalizers有以下关键区别:
- 不能包含tokenizer(分词器)
- 只能使用特定的字符过滤器(char filters)和token过滤器(token filters)
- 输出结果始终是单个token
Normalizers的核心组件
可用的字符过滤器
Normalizers支持使用字符过滤器对原始文本进行预处理,例如:
- 特殊字符转换(如将«»转换为引号)
- Unicode字符规范化
可用的token过滤器
由于Normalizers只能输出单个token,因此只能使用基于单个字符操作的过滤器,包括:
lowercase
:转换为小写asciifolding
:将非ASCII字符转换为ASCII近似字符trim
:去除前后空格uppercase
:转换为大写- 各种语言的规范化过滤器(如
german_normalization
、hindi_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"
}
}
}
}
这个示例中:
- 首先定义了一个字符过滤器
quote
,将法语引号«»转换为标准引号 - 然后创建了一个名为
my_normalizer
的自定义Normalizer,它:- 使用
quote
字符过滤器 - 依次应用
lowercase
和asciifolding
过滤器
- 使用
- 最后在映射中将这个Normalizer应用于
foo
字段
典型应用场景
Normalizers特别适用于以下场景:
- 关键字规范化:确保存储和搜索时使用统一格式(如统一大小写)
- 标识符处理:处理产品代码、用户名等不需要分词的字段
- 多语言支持:处理不同语言的特殊字符规范化
- 数据清洗:统一不同来源数据的格式
最佳实践建议
- 对于需要精确匹配但不分词的字段,优先考虑使用Normalizer而非Analyzer
- 保持Normalizer的简单性,避免过多处理步骤
- 测试Normalizer效果时,可以使用
_analyze
API进行验证 - 考虑性能影响,复杂的字符转换可能影响索引速度
通过合理使用Normalizers,可以显著提升Elasticsearch中关键字字段的搜索质量和一致性,同时保持高效的查询性能。
elasticsearch 项目地址: https://gitcode.com/gh_mirrors/elas/elasticsearch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考