【问题标题】:Elastic Search with phonetic search带语音搜索的弹性搜索
【发布时间】:2020-11-03 02:28:28
【问题描述】:

我试图让 Elastic Search 在城市列表中进行语音搜索。我的目标是即使用户使用不正确的拼写也能找到匹配的结果。

我已经完成了以下步骤:

  1. 删除域

    curl -X DELETE "localhost:9200/city/"
    
  2. 创建新域

    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"
          }
        }
      }
    }'
    
  3. 填写一些样本数据

    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"
    }
    '
    
  4. 在城市中搜索 - 在这里我得到一个结果

    curl -X GET ""localhost:9200/city/_search?pretty" -H 'Content-Type: application/json' -d'
    {
       "query":{
          "query_string":{
             "query":"Mayrhofen" 
          }
       }
    }
    '
    

我尝试使用 Mayerhofen 进行查询,并期望得到与使用 Mayrhofen 相同的结果。 IschglIchglSaalbachSalbach 的问题相同。

我的错误在哪里?有什么消息吗?

【问题讨论】:

    标签: amazon-web-services elasticsearch elasticsearch-phonetic


    【解决方案1】:

    问题是您使用了错误的encodermetaphone 无法匹配。

    您需要使用double_metaphone 进行输入。它基于语音算法实现。我建议您了解您的数据和算法,以确保语音算法是否最适合您的目的。

    映射:

    {
          "analysis": {
            "analyzer": {
              "double_meta_true_analyzer": {
                "tokenizer": "standard",
                "filter": [
                  "lowercase",
                  "true_doublemetaphone"
                ]
              }
            },
            "filter": {
              "true_doublemetaphone": {
                "type": "phonetic",
                "encoder": "double_metaphone",
                "replace": true
              }
            }
          }
        }
    

    它与文档匹配。

    为什么变音位不匹配:

    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
            }
        ]
    }
    

    【讨论】:

    • 感谢您的帮助...愚蠢地,我使用 phoentic 搜索找到的每个示例都使用 metaphone 编码器。
    • 没问题。很高兴它有帮助。编码愉快。
    • 嗨@Gibbs:有没有办法像谷歌一样获得“正确”的搜索词组:当我寻找“Maierhofen”时,“你是说:mayrhofen”吗?
    • 你需要使用短语suggester并在你的代码中处理它。
    • 是否需要特殊的安装或配置?
    猜你喜欢
    • 2018-10-26
    • 2021-11-23
    • 2018-07-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-29
    • 1970-01-01
    • 2022-12-08
    相关资源
    最近更新 更多