2

在我的分析器中,我添加了 asciifolding 过滤器。在大多数情况下,这很好用,但是在使用丹麦语时,我不想规范化 øæå 字符,因为“rød”和“rod”是非常不同的词。

我们正在使用托管的弹性云集群,所以如果可能的话,一个不需要通过云平台进行任何非标准部署的解决方案。

有没有办法进行 asciifolding,但将某些字符列入白名单?

目前在 ES 版本 6.8 上运行

4

2 回答 2

1

由于您已经在使用ASCII 折叠令牌过滤器,但它是一个令牌过滤器,因此它确实无法过滤掉某些字符,因为分析过程包括以下三个连续步骤:

  1. 字符过滤器(在这里您可以过滤或替换某些字符)
  2. 标记器(此过程生成标记)
  3. 令牌过滤器(可以修改tokenizer生成的令牌)

没有开箱即用的解决方案,可以有效地解决您的问题(只是通过不规范化几个字符)。

在此参考 ES 书籍文章的权威指南。

您可以在标记过滤器中使用 保留原始参数,这会将原始标记保留在同一位置,但这存在相关性较低且与原始单词完全匹配的问题。

因此,在同一本书中,它建议在不同的字段中索引原始含义,然后使用带有 most_fields 的 multi_match 查询,更多信息可以在this中找到。

于 2019-12-21T15:04:25.970 回答
1

您可能应该使用ICU 折叠令牌过滤器

文档中:

基于 UTR#30 的 Unicode 字符的大小写折叠,如 steroids 上的 ASCII 折叠标记过滤器。

它可以让你做 AsciiFolding 过滤器所做的一切,但除此之外,它还允许你通过unicodeSetFilter属性忽略一系列字符。

在这种情况下,您要忽略 æ,ø,å,Æ,Ø,Å:

"unicodeSetFilter": "[^æøåÆØÅ]"

完整示例:

PUT icu_sample
{
  "settings": {
    "index": {
      "analysis": {
        "analyzer": {
          "danish_analyzer": {
            "tokenizer": "icu_tokenizer",
            "filter": [
              "danish_folding",
              "lowercase"
            ]
          }
        },
        "filter": {
          "danish_folding": {
            "type": "icu_folding",
            "unicodeSetFilter": "[^æøåÆØÅ]"
          }
        }
      }
    }
  }
}
于 2020-02-19T13:48:26.047 回答