在我的分析器中,我添加了 asciifolding 过滤器。在大多数情况下,这很好用,但是在使用丹麦语时,我不想规范化 øæå 字符,因为“rød”和“rod”是非常不同的词。
我们正在使用托管的弹性云集群,所以如果可能的话,一个不需要通过云平台进行任何非标准部署的解决方案。
有没有办法进行 asciifolding,但将某些字符列入白名单?
目前在 ES 版本 6.8 上运行
在我的分析器中,我添加了 asciifolding 过滤器。在大多数情况下,这很好用,但是在使用丹麦语时,我不想规范化 øæå 字符,因为“rød”和“rod”是非常不同的词。
我们正在使用托管的弹性云集群,所以如果可能的话,一个不需要通过云平台进行任何非标准部署的解决方案。
有没有办法进行 asciifolding,但将某些字符列入白名单?
目前在 ES 版本 6.8 上运行
由于您已经在使用ASCII 折叠令牌过滤器,但它是一个令牌过滤器,因此它确实无法过滤掉某些字符,因为分析过程包括以下三个连续步骤:
没有开箱即用的解决方案,可以有效地解决您的问题(只是通过不规范化几个字符)。
在此参考 ES 书籍文章的权威指南。
您可以在标记过滤器中使用 保留原始参数,这会将原始标记保留在同一位置,但这存在相关性较低且与原始单词完全匹配的问题。
因此,在同一本书中,它建议在不同的字段中索引原始含义,然后使用带有 most_fields 的 multi_match 查询,更多信息可以在this中找到。
您可能应该使用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": "[^æøåÆØÅ]"
}
}
}
}
}
}