在分析器中,我添加了asciifolding过滤器。在大多数情况下,这很好用,但是在使用丹麦语时,我不想对øæå字符进行标准化,因为“rød”和“ rod”是非常不同的单词。
我们正在使用托管的弹性云集群,因此,如果可能的话,该解决方案不需要通过云平台进行任何非标准部署。
除了将某些字符列入白名单外,还有什么方法可以进行密排?
当前在ES版本6.8上运行
答案 0 :(得分:1)
您可能应该使用 ICU折叠令牌过滤器。
根据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,但由于它是令牌过滤器,所以它实际上不能过滤出某些字符,因为分析过程包括以下三个连续步骤:
没有开箱即用的解决方案,它可以有效地解决您的问题(仅通过不规范几个字符即可)。
请参阅有关this的ES书的权威指南。
您可以在令牌过滤器中使用preserve original参数,该参数会将原始令牌保留在同一位置,但这存在一个问题,即相关性较低,并且与原始单词完全匹配。
因此,在同一本书中,建议将不同字段的原始含义编入索引,然后将multi_match查询与most_fields一起使用,有关更多信息,请参见this。