Elasti c Поиск по телефону c поиск - PullRequest
0 голосов
/ 13 июля 2020

Я пытаюсь получить Elasti c Search, делая поиск phoneti c в списке городов. Моя цель - найти совпадающие результаты, даже если пользователь использует неправильное написание.

Я выполнил следующие шаги:

  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 . Та же проблема с Ischgl и Ichgl или Saalbach и Salbach .

Где моя ошибка? Что-то не так?

1 Ответ

1 голос
/ 14 июля 2020

Проблема в том, что вы используете неправильный encoder. metaphone не может соответствовать этим.

Что вам нужно использовать, это double_metaphone для ваших входных данных. Он основан на реализации алгоритма phoneti c. Я предлагаю вам понять свои данные и алгоритм, чтобы убедиться, что алгоритм phoneti c лучше всего подходит для ваших целей.

Отображение:

{
      "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
        }
    ]
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...