最后,在尝试任何其他匹配方法都无效后,我们可以求助于搜索发音相似的词,即使他们的拼写不同。
有一些用于将词转换成语音标识的算法。 Soundex 算法是这些算法的鼻祖, 而且大多数语音算法是 Soundex 的改进或者专业版本,例如 Metaphone 和 Double Metaphone (扩展了除英语以外的其他语言的语音匹配), Caverphone 算法匹配了新西兰的名称, Beider-Morse 算法吸收了 Soundex 算法为了更好的匹配德语和依地语名称, Kölner Phonetik 为了更好的处理德语词汇。
值得一提的是,语音算法是相当简陋的,他们设计初衷针对的语言通常是英语或德语。这限制了他们的实用性。 不过,为了某些明确的目标,并与其他技术相结合,语音匹配能够作为一个有用的工具。
首先,你需要从 https://www.elastic.co/guide/en/elasticsearch/plugins/current/analysis-phonetic.html 获取语音分析插件并在集群的每个节点安装, 然后重启每个节点。
然后,您可以创建一个使用语音语汇单元过滤器的自定义分析器,并尝试下面的方法:
PUT /my_index
{
"settings": {
"analysis": {
"filter": {
"dbl_metaphone": { (1)
"type": "phonetic",
"encoder": "double_metaphone"
}
},
"analyzer": {
"dbl_metaphone": {
"tokenizer": "standard",
"filter": "dbl_metaphone" (2)
}
}
}
}
}
-
首先,配置一个自定义
phonetic
语汇单元过滤器并使用double_metaphone
编码器。 -
然后在自定义分析器中使用自定义语汇单元过滤器。
现在我们可以通过 analyze
API 来进行测试:
GET /my_index/_analyze?analyzer=dbl_metaphone
Smith Smythe
每个 Smith
和 Smythe
在同一位置产生两个语汇单元: SM0
和 XMT
。
通过分析器播放 John
, Jon
和 Johnnie
将产生两个语汇单元 JN
和 AN
,而 Jonathon
产生语汇单元 JN0N
和 ANTN
。
语音分析器可以像任何其他分析器一样使用。 首先映射一个字段来使用它,然后索引一些数据:
PUT /my_index/_mapping/my_type
{
"properties": {
"name": {
"type": "string",
"fields": {
"phonetic": { (1)
"type": "string",
"analyzer": "dbl_metaphone"
}
}
}
}
}
PUT /my_index/my_type/1
{
"name": "John Smith"
}
PUT /my_index/my_type/2
{
"name": "Jonnie Smythe"
}
-
name.phonetic
字段使用自定义dbl_metaphone
分析器。
可以使用 match
查询来进行搜索:
GET /my_index/my_type/_search
{
"query": {
"match": {
"name.phonetic": {
"query": "Jahnnie Smeeth",
"operator": "and"
}
}
}
}
这个查询返回全部两个文档,演示了如何进行简陋的语音匹配。 用语音算法计算评分是没有价值的。 语音匹配的目的不是为了提高精度,而是要提高召回率—以扩展足够的范围来捕获可能匹配的文档。
通常更有意义的使用语音算法是在检索到结果后,由另一台计算机进行消费和后续处理,而不是由人类用户直接使用。