带语音搜索的弹性搜索
Elastic Search with phonetic search
我正在尝试让 Elastic Search 在城市列表中进行语音搜索。我的目标是即使用户使用了错误的拼写也能找到匹配的结果。
我已经完成了以下步骤:
删除域
curl -X DELETE "localhost:9200/city/"
创建新域
curl -X PUT "localhost:9200/city/?pretty" -H 'Content-Type: application/json' -d'
{
"settings": {
"index": {
"analysis": {
"analyzer": {
"my_analyzer": {
"tokenizer": "standard",
"filter": [
"lowercase",
"my_metaphone"
]
}
},
"filter": {
"my_metaphone": {
"type": "phonetic",
"encoder": "metaphone",
"replace": true
}
}
}
}
},
"mappings": {
"properties": {
"name": {
"type": "text",
"analyzer": "my_analyzer"
}
}
}
}'
填写一些示例数据
curl -X PUT "localhost:9200/city/_doc/1?pretty" -H 'Content-Type: application/json' -d'
{
"name":"Mayrhofen"
}
'
curl -X PUT "localhost:9200/city/_doc/2?pretty" -H 'Content-Type: application/json' -d'
{
"name":"Ischgl"
}
'
curl -X PUT "localhost:9200/city/_doc/3?pretty" -H 'Content-Type: application/json' -d'
{
"name":"Saalbach"
}
'
在城市中搜索 - 我得到了结果
curl -X GET ""localhost:9200/city/_search?pretty" -H 'Content-Type: application/json' -d'
{
"query":{
"query_string":{
"query":"Mayrhofen"
}
}
}
'
我尝试使用 Mayerhofen 进行查询,并期望得到与使用 Mayrhofen 相同的结果。 Ischgl 和 Ichgl 或 Saalbach 和 Salbach[=46= 同样的问题].
我的错误在哪里?有什么消息吗?
问题是你用错了encoder
。 metaphone
无法匹配那些。
您需要使用的是 double_metaphone
作为您的输入。它基于语音算法实现。我建议您了解您的数据和算法,以确保拼音算法是否最适合您的目的。
映射:
{
"analysis": {
"analyzer": {
"double_meta_true_analyzer": {
"tokenizer": "standard",
"filter": [
"lowercase",
"true_doublemetaphone"
]
}
},
"filter": {
"true_doublemetaphone": {
"type": "phonetic",
"encoder": "double_metaphone",
"replace": true
}
}
}
}
与文档相符。
为什么metaphone不匹配:
GET http://localhost:9200/city2/_analyze
{
"field":"meta_true",
"text":"Mayrhofen"
}
产量
{
"tokens": [
{
"token": "MRHF",
"start_offset": 0,
"end_offset": 9,
"type": "<ALPHANUM>",
"position": 0
}
]
}
下面分析
{
"field":"meta_true",
"text":"Mayerhofen"
}
产量
{
"tokens": [
{
"token": "MYRH",
"start_offset": 0,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 0
}
]
}
Double_Metaphone 按以下方式工作:
GET
{
"field":"doublemeta_true",
"text":"Mayerhofen"
}
和
{
"field":"doublemeta_true",
"text":"Mayerhofen"
}
和
{
"field":"doublemeta_true",
"text":"Mayrhofen"
}
产量
{
"tokens": [
{
"token": "MRFN",
"start_offset": 0,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 0
}
]
}
我正在尝试让 Elastic Search 在城市列表中进行语音搜索。我的目标是即使用户使用了错误的拼写也能找到匹配的结果。
我已经完成了以下步骤:
删除域
curl -X DELETE "localhost:9200/city/"
创建新域
curl -X PUT "localhost:9200/city/?pretty" -H 'Content-Type: application/json' -d' { "settings": { "index": { "analysis": { "analyzer": { "my_analyzer": { "tokenizer": "standard", "filter": [ "lowercase", "my_metaphone" ] } }, "filter": { "my_metaphone": { "type": "phonetic", "encoder": "metaphone", "replace": true } } } } }, "mappings": { "properties": { "name": { "type": "text", "analyzer": "my_analyzer" } } } }'
填写一些示例数据
curl -X PUT "localhost:9200/city/_doc/1?pretty" -H 'Content-Type: application/json' -d' { "name":"Mayrhofen" } ' curl -X PUT "localhost:9200/city/_doc/2?pretty" -H 'Content-Type: application/json' -d' { "name":"Ischgl" } ' curl -X PUT "localhost:9200/city/_doc/3?pretty" -H 'Content-Type: application/json' -d' { "name":"Saalbach" } '
在城市中搜索 - 我得到了结果
curl -X GET ""localhost:9200/city/_search?pretty" -H 'Content-Type: application/json' -d' { "query":{ "query_string":{ "query":"Mayrhofen" } } } '
我尝试使用 Mayerhofen 进行查询,并期望得到与使用 Mayrhofen 相同的结果。 Ischgl 和 Ichgl 或 Saalbach 和 Salbach[=46= 同样的问题].
我的错误在哪里?有什么消息吗?
问题是你用错了encoder
。 metaphone
无法匹配那些。
您需要使用的是 double_metaphone
作为您的输入。它基于语音算法实现。我建议您了解您的数据和算法,以确保拼音算法是否最适合您的目的。
映射:
{
"analysis": {
"analyzer": {
"double_meta_true_analyzer": {
"tokenizer": "standard",
"filter": [
"lowercase",
"true_doublemetaphone"
]
}
},
"filter": {
"true_doublemetaphone": {
"type": "phonetic",
"encoder": "double_metaphone",
"replace": true
}
}
}
}
与文档相符。
为什么metaphone不匹配:
GET http://localhost:9200/city2/_analyze
{
"field":"meta_true",
"text":"Mayrhofen"
}
产量
{
"tokens": [
{
"token": "MRHF",
"start_offset": 0,
"end_offset": 9,
"type": "<ALPHANUM>",
"position": 0
}
]
}
下面分析
{
"field":"meta_true",
"text":"Mayerhofen"
}
产量
{
"tokens": [
{
"token": "MYRH",
"start_offset": 0,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 0
}
]
}
Double_Metaphone 按以下方式工作:
GET
{
"field":"doublemeta_true",
"text":"Mayerhofen"
}
和
{
"field":"doublemeta_true",
"text":"Mayerhofen"
}
和
{
"field":"doublemeta_true",
"text":"Mayrhofen"
}
产量
{
"tokens": [
{
"token": "MRFN",
"start_offset": 0,
"end_offset": 10,
"type": "<ALPHANUM>",
"position": 0
}
]
}