规范化器

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

规范化器在关键字搜索中很有用(即在基于词项的查询中),因为它允许您对任何给定输入运行分词过滤器和字符过滤器。例如,它使得传入查询 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 实例的过滤器。以下列表是核心 UDB-SX 存储库中模块和插件内找到的兼容过滤器。

common-analysis 模块

此模块无需安装;它默认可用。

字符过滤器:pattern_replace, mapping

分词过滤器:arabic_normalization, asciifolding, 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

analysis-icu 插件

字符过滤器:icu_normalizer

分词过滤器:icu_normalizer, icu_folding, icu_transform

analysis-kuromoji 插件

字符过滤器:normalize_kanji, normalize_kana

analysis-nori 插件

字符过滤器:normalize_kanji, normalize_kana