【问题标题】:Ignoring specific characters with Elasticsearch asciifolding使用 Elasticsearch asciifolding 忽略特定字符
【发布时间】:2020-02-19 23:23:24
【问题描述】:

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

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

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

目前在 ES 版本 6.8 上运行

【问题讨论】:

  • @mortenbook,你能解决你的问题吗?

标签: elasticsearch elastic-cloud


【解决方案1】:

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

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

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

请参阅this 上的 ES 书籍文章的权威指南。

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

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

【讨论】:

    【解决方案2】:

    您可能应该使用 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": "[^æøåÆØÅ]"
              }
            }
          }
        }
      }
    }
    

    【讨论】:

    • 这看起来很有前途,而且云平台上标配 analysis-icu 插件。我会试试这个。
    • 我很肯定它会为您解决问题。我也可以推荐“scandinavian_normalization”过滤器 (elastic.co/guide/en/elasticsearch/reference/current/…),如果您关心其他斯堪的纳维亚国家能够使用自己的 ö/ø、ä/æ 等版本找到您的内容,而不会破坏特殊字符。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多