Фонетические результаты поиска целых чисел с Elasticserach

Простите меня, поскольку я новичок в Elasticsearch, но я следую фонетическому руководству по началу работы, найденному здесь: Фонетическое соответствие

У меня есть следующее

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

Есть ли что-то, чего мне не хватает в моем фонетическом запросе, который я должен определить, чтобы получить как числовые, так и буквенно-цифровые токены?

2 ответа

Это невозможно. Двойной Метафон - это форма алгоритма фонетического кодирования. Проще говоря, он пытается закодировать одинаково произнесенные слова к одному и тому же ключу.

Это облегчает поиск таких терминов, как имена, которые могут быть написаны по-разному, но звучат одинаково.

Как видно из алгоритма, двойной метафон игнорирует цифры / цифры. Вы можете прочитать больше о двойном метафоне здесь.

Лучшим примером фонетического сопоставления является поиск "Джуди Штайнхейзер", когда поисковым запросом является [Jodi Stynehaser].


Если вам нужна возможность поиска по номерам с использованием английского языка, вам нужно создать синонимы или альтернативный текст во время индексации, чтобы в Elasticsearch хранились как "300", так и "триста".

Не должно быть слишком сложно найти / написать функцию, которая конвертирует целые числа в английский.

Вызывайте свою функцию при создании документа для загрузки в ES.

В качестве альтернативы, напишите это в Groovy и назовите его как скрипт Transform в вашем отображении.

Другие вопросы по тегам