据我在ES文档中读到:
(来源:http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/custom-analyzers.html)
从这两个陈述中,我了解到执行了以下步骤:
问题:
我可能有一个char_filter,可以一次转换多个字母。
示例:ph - > F。
但是,“PH”不会变成“f”,因为“PH”不是映射的一部分。
所以,对“philipp”的分析检索“filipp”,而“Philipp”检索“philipp”。
使用大写和小写(为了在两种情况下都能达到相同的结果),char_filter中的映射数将是(字符数)²。
示例:ph - > F; Ph - > F; pH - > F; PH - > F。
如果我只有4个映射,我不会有问题,但如果我需要更多的x²映射,char_filter往往会变得很乱。
索引示例:
{
"settings" : {
"index" : {
"analysis" : {
"analyzer" : {
"default_index" : {
"type" : "custom",
"tokenizer" : "whitespace",
"filter" : [
"lowercase"
],
"char_filter" : [
"misc_simplifications"
]
}
},
"char_filter" : {
"misc_simplifications" : {
"type" : "mapping",
"mappings" : [
"ph=>f","Ph=>F","pH=>f","PH=>F"
]
}
}
}
}
}
}
哲学问题:
据我所知,我可能想要同等对待“ph”和“Ph”,但“pH”可能意味着完全不同的东西。但有没有办法在char_filter阶段之前将字符转换为小写?它有意义吗?
因为这个大的映射让我觉得我做错了什么,或者我能找到一个更简单(更优雅)的解决方案。
答案 0 :(得分:4)
您按步骤顺序纠正:
然而,CharFilter的主要目的是清理数据以使标记化更容易。例如,通过剥离XML标记或用空格字符替换分隔符。
所以 - 我会将misc_simplifications
作为TokenFilter放在小写过滤器之后应用。
{
"settings" : {
"index" : {
"analysis" : {
"analyzer" : {
"default_index" : {
"type" : "custom",
"tokenizer" : "whitespace",
"filter" : [
"lowercase",
"misc_simplifications"
]
}
},
"filter" : {
"misc_simplifications" : {
"type" : "pattern_replace",
"pattern": "ph",
"replacement":"f"
}
}
}
}
}
}
注意我已使用模式替换而不是映射。 您还可以修改正则表达式,以仅替换" ph"在令牌的开头。
此外 - 您的映射看起来像语音替换。我不确定您的要求,但看起来phonetic token filter可能对您有所帮助。