Elasticsearch:词分析中的 Normalizer 的使用

在 Elasticsearch 的词分析中,normalizer 与 analyzer 类似,只是它们只能发出 一个 token。 因此,它们没有 tokenizer,只接受可用 char filters 和 token filters 的子集。 只允许使用基于每个字符的过滤器。 例如,允许使用 lowercase 过滤器,但不允许使用 stemming filter(词干过滤器),它需要将关键字视为一个整体。 当前可以在规范化器中使用的过滤器列表如下:arabic_normalization、asciifolding、bengali_normalization、cjk_width、decimal_digit、elision、german_normalization、hindi_normalization、indic_normalization、lowercase、persian_normalization、scandinavian_folding、serbian_normalization、sorani_normalization、uppercase。

PUT my_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"
      }
    }
  }
}

在上面,我们在 normalizer 的定义中,我们使用了一个 char filter。它把 << 及 >> 字符转换为引号 “。同时它也对字母进行小写及 asciifolding。我们现在以如下的一个文档来进行展示:

PUT my_index/_doc/1
{
  "foo": "&#xAB;a&#xE7;a&#xED; &#xE0; la Carte&#xBB;"
}

根据我们上面定义的 normalizer,我们可以看出来上面的字段 foo 有且仅有一个 token:”acai a la carte”,这是因为 << 及 >> 字符转换为引号 “,而 “açaí à la Carte” 经过 asciifolding 过滤器后,变为 acai a la Carte。再经过 lowercase 的过滤器,它就变为 “acai a la carte”。

针对上面的索引,我们可以进行如下的搜索:

GET my_index/_search
{
  "query": {
    "match": {
      "foo": "\"acai a la carte\""
    }
  }
}

上面返回的结果是:

{
  "took": 0,
  "timed_out": false,
  "_shards": {
    "total": 1,
    "successful": 1,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": {
      "value": 1,
      "relation": "eq"
    },
    "max_score": 0.2876821,
    "hits": [
      {
        "_index": "my_index",
        "_id": "1",
        "_score": 0.2876821,
        "_source": {
          "foo": "&#xAB;a&#xE7;a&#xED; &#xE0; la Carte&#xBB;"
        }
      }
    ]
  }
}

Original: https://blog.csdn.net/UbuntuTouch/article/details/126989051
Author: Elastic 中国社区官方博客
Title: Elasticsearch:词分析中的 Normalizer 的使用

原创文章受到原创版权保护。转载请注明出处:https://www.johngo689.com/542355/

转载文章受原作者版权保护。转载请注明原作者出处!

(0)

大家都在看

亲爱的 Coder【最近整理,可免费获取】👉 最新必读书单  | 👏 面试题下载  | 🌎 免费的AI知识星球