原谅我,因为我不熟悉Elasticsearch,但我正在遵循这里的语音入门指南:Phonetic Matching
我有以下几点
POST /app
{
"settings": {
"index": {
"analysis": {
"filter": {
"dbl_metaphone": {
"type": "phonetic",
"encoder": "double_metaphone"
}
},
"analyzer": {
"dbl_metaphone": {
"tokenizer": "standard",
"filter": "dbl_metaphone"
}
}
}
}
},
"mappings": {
"movie": {
"properties": {
"title": {
"type": "string",
"fields": {
"phonetic": {
"type": "string",
"analyzer": "dbl_metaphone"
}
}
},
"year": {
"type": "string",
"fields": {
"phonetic": {
"type": "string",
"analyzer": "dbl_metaphone"
}
}
}
}
}
} }
我通过执行以下操作来添加一些结果:
POST /app/movie
{ "title": "300", "year": 2006"} & { "title":"500 days of summer", "year": "2009" }
我想通过输入这个查询来查询电影'300‘:
POST /app/movie/_search
{
"query": {
"match": {
"title.phonetic": {
"query": "three hundred"
}
}
}
}
但是我没有得到任何结果。如果将我的查询更改为"300“,尽管它工作得很好。
如果我这样做了:
GET /app/_analyze?analyzer=dbl_metaphone&text=300
{
"tokens": [
{
"token": "300",
"start_offset": 0,
"end_offset": 3,
"type": "<NUM>",
"position": 0
}
]
}
我看到只有一个数字标记返回,而不是字母数字版本,如下所示:
GET /app/_analyze?analyzer=dbl_metaphone&text=three hundred
{
"tokens": [
{
"token": "0R",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "TR",
"start_offset": 0,
"end_offset": 5,
"type": "<ALPHANUM>",
"position": 0
},
{
"token": "HNTR",
"start_offset": 6,
"end_offset": 13,
"type": "<ALPHANUM>",
"position": 1
}
]
}
我的语音查询是否遗漏了什么东西,我应该定义这些东西来同时获得数字和字母数字令牌?
发布于 2015-12-15 09:26:56
这是不可能的。双变音位是一种语音编码算法。简单地说,它试图将发音相似的单词编码到同一个键。
这有助于搜索名称等可能拼写不同但发音相同的术语。
正如您从算法中看到的,double metaphone忽略数字/数字字符。您可以阅读有关double metaphone here的更多信息。
发布于 2015-12-18 04:06:55
语音匹配的一个更好的例子是当搜索查询是Jodi Stynehaser时找到"Judy Steinheiser“。
如果您需要能够使用英语搜索数字,那么您将需要在索引时创建一些同义词或替代文本,以便"300“和”三百“都存储在Elasticsearch中。
find/write a function that converts integers to English.应该不会太难
在构造文档以插入ES时调用您的函数。
或者,用Groovy和call it as a in your mapping. 编写它
https://stackoverflow.com/questions/34275900
复制相似问题