使用Elasticsearch拼写忽略特定字符

时间:2019-12-20 13:04:50

标签: elasticsearch elastic-cloud

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

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

除了将某些字符列入白名单外,还有什么方法可以进行密排?

当前在ES版本6.8上运行

2 个答案:

答案 0 :(得分:1)

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

来自documentation

根据UTR#30对Unicode字符进行大小写折叠,例如 类固醇上的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": "[^æøåÆØÅ]"
          }
        }
      }
    }
  }
}

答案 1 :(得分:0)

由于您已经在使用ASCII folding token filter,但由于它是令牌过滤器,所以它实际上不能过滤出某些字符,因为分析过程包括以下三个连续步骤:

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

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

请参阅有关this的ES书的权威指南。

您可以在令牌过滤器中使用preserve original参数,该参数会将原始令牌保留在同一位置,但这存在一个问题,即相关性较低,并且与原始单词完全匹配。

因此,在同一本书中,建议将不同字段的原始含义编入索引,然后将multi_match查询与most_fields一起使用,有关更多信息,请参见this