规范化 #
规范化的功能与分词器类似,但它仅输出单个词元。它不包含分词器,并且只能包含特定类型的字符过滤器和词元过滤器。这些过滤器只能执行字符级别的操作,例如字符或模式替换,而不能对整个词元进行操作。这意味着不支持用同义词替换词元或进行词干提取。
规范化在关键字搜索(即基于词项的查询)中很有用,因为它允许你对任何给定的输入运行词元过滤器和字符过滤器。例如,它使得能够将传入的查询 “Naïve” 与索引词项 “naive” 进行匹配。
考虑以下示例:
创建一个带有自定义规范化的新索引:
PUT /sample-index
{
"settings": {
"analysis": {
"normalizer": {
"normalized_keyword": {
"type": "custom",
"char_filter": [],
"filter": [ "asciifolding", "lowercase" ]
}
}
}
},
"mappings": {
"properties": {
"approach": {
"type": "keyword",
"normalizer": "normalized_keyword"
}
}
}
}
索引一个文档
POST /sample-index/_doc/
{
"approach": "naive"
}
以下查询与该文档匹配。这是预期的结果:
GET /sample-index/_search
{
"query": {
"term": {
"approach": "naive"
}
}
}
但这个查询同样也与该文档匹配:
GET /sample-index/_search
{
"query": {
"term": {
"approach": "Naïve"
}
}
}
要理解为什么会这样,我们来考虑一下规范化所产生的影响:
GET /sample-index/_analyze
{
"normalizer" : "normalized_keyword",
"text" : "Naïve"
}
在内部,规范化只接受 NormalizingTokenFilterFactory
或 NormalizingCharFilterFactory
实例的过滤器。以下是在作为 Easysearch 核心存储库一部分的模块和插件中找到的兼容过滤器列表。
通用分词模块 #
该模块无需安装,默认即可使用。
字符过滤器:pattern_replace
(模式替换)、mapping
(映射)
词元过滤器:arabic_normalization
(阿拉伯语规范化)、asciifolding
(ASCII 折叠)、bengali_normalization
(孟加拉语规范化)、cjk_width
(中日韩字符宽度调整)、decimal_digit
(十进制数字处理)、elision
(省略)、german_normalization
(德语规范化)、hindi_normalization
(印地语规范化)、indic_normalization
(印度语系规范化)、lowercase
(转换为小写)、persian_normalization
(波斯语规范化)、scandinavian_folding
(斯堪的纳维亚语折叠)、scandinavian_normalization
(斯堪的纳维亚语规范化)、serbian_normalization
(塞尔维亚语规范化)、sorani_normalization
(索拉尼语规范化)、trim
(去除首尾空白字符)、uppercase
(转换为大写)