带语音搜索的弹性搜索

Elastic Search with phonetic search

我正在尝试让 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[=46= 同样的问题].

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

问题是你用错了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
          }
        }
      }
    }

与文档相符。

为什么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
        }
    ]
}