我们目前正在通过扩展我们的弹性搜索映射为我们的应用程序添加语音搜索支持。由于我们有一位德国客户,我们希望应用古龙语音算法。
当我检查可用的语音编码器时(请参阅https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-phonetic-token-filter.html),我看到有两个编码器很可能引用相同的算法->,即">koelnerphonetik"one_answers">古龙水"。两者似乎都是基于古龙水语音算法。
我对这两个编码器有点困惑,因为它们看起来是一样的。有没有这两个编码器的具体原因?如何确定哪个编码器更适合我?
我也对两者之间的区别感兴趣,因为我试图从我用语音算法转换的领域中获取最大的信息。
首先,事实上,这两个指的是相同的语音转换。
但是,它们的实现有点不同,在某些情况下会导致不同的结果。
如果在要分析的字符串中有一个标记,例如";John";,两个变换的结果标记将是CCD_ 1。
然而,如果您有多个令牌,例如";John Doe";,两种转换的结果可能不同:
- 如果您使用";标准鞋刀";在ES中,它在token中拆分字符串:两个转换之间的结果将相同:
{
"tokens" : [
{
"token" : "06",
"start_offset" : 0,
"end_offset" : 4,
"type" : "<ALPHANUM>",
"position" : 0
},
{
"token" : "2",
"start_offset" : 5,
"end_offset" : 8,
"type" : "<ALPHANUM>",
"position" : 1
}
]
}
因为,使用标准的令牌化器,我们将回到在转换字符串时处理一个令牌的情况。字符串在语音转换之前由标记分割。
如果您使用";关键词标记器";在ES中,字符串不会被拆分为多个令牌(这个令牌化器几乎什么都不做(此处出现差异:
Cologne
:它将字符串转换为单个令牌,生成的令牌为062
。koelnerphonetik
:它还将字符串转换为单个令牌并为字符串中的每个令牌拆分添加令牌。结果令牌是由"1"分隔的单个字符串_"->;062_06_2
。
如果你想自己尝试,你可以[测试你的分析器],例如:
POST _analyze
{
"analyzer": "cologne_analyzer",
"text": "John"
}
源代码:
通过ElasticSearch 实现KoelnerPhonetikES插件使用的commons编解码器中的科隆语音实现