Elasticsearch оценивает запрос в соответствии с 5 нечеткими совпадениями в текстовом массиве - PullRequest
0 голосов
/ 16 марта 2020

Я пытаюсь запросить поле альтернативные имена сопоставления ( отображение географических названий ), которое состоит из списка всех различных названий страны. Поле имеет текстовый тип.

Цель состоит в том, чтобы получить исходное название страны, учитывая запрос, который является другой записью, возможно с опечатками:

GET /geonames/_search
{
some_query_with_parameter("Republique Francaise")
}

Должен вернуть документ, соответствующий страна "Франция". Моя первая попытка была:

GET /geonames/_search
{
        "query": {
            "bool": {
                "should": [
                    {
                        "match": {
                            "name": {
                                "query": "Republique Francaise",
                                "operator": "and",
                                "fuzziness": "AUTO",
                                "boost": 3
                            }
                        }
                    },
                    {
                        "match": {
                            "alternativenames": {
                                "query": "Republique Francaise",
                                "operator": "and",
                                "fuzziness": "AUTO",
                                "boost": 1
                            }
                        }
                    }
                ],
                "minimum_should_match": 1,

                "filter": {
                     filtering documents which represent countries, long and not relevant to show
                   }
            }
        }

Но это заставляет такие страны, как Джибути или Мали, иметь более высокие оценки, чем Франция. Это связано с тем, что анализатор по умолчанию разбивает запрос на ["Republique", "Francaise"], а в таких странах, как Djiouti, есть много альтернативных имен, включая варианты "Republique" и "Francaise" из-за бывших колоний. У Джибути действительно есть названия, такие как «République de Djibouti», «Somal ie Francaise» в области альтернативные имена . Обратите внимание, что эти имена взяты из geonames.org

Поэтому я попытался использовать анализатор ключевых слов, надеясь, что оценка будет вычислена по всем именам. Я попытался запросить только поле альтернативные имена , чтобы понять, как ведет себя этот анализатор:

GET /geonames/_search
{
        "query": {
            "bool": {
                "must": 
                    {
                        "match": {
                            "alternativenames": {
                                "query": "Republique Francaise",
                                "analyzer": "keyword",
                                "fuzziness": "AUTO",
                                "boost": 1
                            }
                        }
                    },

                "filter": { 
                    filtering documents which represent countries, long and not relevant to show
                }
            }
        }

Но, к моему удивлению, хотя "Republique Francaise" точно присутствует в поле альтернативные имена , этот запрос не возвращает совпадений. Извлечение поля альтернативных имен для документа, представляющего Францию:

alternativenames:[
            ...,
            "Pransya",
            "Prantsusmaa",
            "Ranska",
            "Republic of France",
            "Republique Francaise",
            "République Française",
            "Ubaranja",
            "Ubufaransa",
            "Ufaransa",
            ...
]

Итак, мои вопросы:

  • Во-первых, почему запрос с использованием анализатора ключевых слов возвращает ноль совпадений при запросе "Republique Francaise"? К вашему сведению, в этом сопоставлении есть 174 альтернативных имени для этой страны.
  • Затем, как я могу реализовать следующую стратегию скоринга: учитывая имя запроса c, , суммируем нечеткие оценки только 5 лучших совпадений из списка альтернативных имен , с весами затухания. Сопоставление должно выполняться на уровне всей строки, т. Е. «Republique Francaise» не следует разбивать на [«Republique», «Francaise»]?
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...