规范化

规范化 #

规范化的功能与分词器类似,但它仅输出单个词元。它不包含分词器,并且只能包含特定类型的字符过滤器和词元过滤器。这些过滤器只能执行字符级别的操作,例如字符或模式替换,而不能对整个词元进行操作。这意味着不支持用同义词替换词元或进行词干提取。

规范化在关键字搜索(即基于词项的查询)中很有用,因为它允许你对任何给定的输入运行词元过滤器和字符过滤器。例如,它使得能够将传入的查询 “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"
}

在内部,规范化只接受 NormalizingTokenFilterFactoryNormalizingCharFilterFactory 实例的过滤器。以下是在作为 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(转换为大写)