Elasticsearch, несколько полей, несколько слов совпадают

Я хочу реализовать функцию автозаполнения в своем приложении с помощью elasticsearch.

Допустим, мой ввод "ronan f", я хочу, чтобы эластичный возвращал все элементы, где "ronan" или "f" содержится в фамилии или имени. Я ожидаю, что elasticsearch отсортирует результат по рангу, поэтому элемент, наиболее близкий к тому, что я ищу, должен быть сверху.

Я пробовал несколько запросов, но ни один из них не дал ожидаемого результата.

Например :

{
  "query": {
    "bool": {
        "must_not": [
            {
                "match": {
                    "email": "*@guest.booking.com"
                }
            }
        ],
        "should": [
            {
                "match": {
                    "lastname": "ronan"
                }
            },
            {
                "match": {
                    "firstname": "ronan"
                }
            },
            {
                "match": {
                    "lastname": "f"
                }
            },
            {
                "match": {
                    "firstname": "f"
                }
            }
        ],
        "minimum_should_match" : 1
    }
  },
  "sort": [
    "_score"
  ],
  "from": 0,
  "size": 30
}

С этим запросом ранги немного расходятся, например:

"_index": "clients",
"_type": "client",
"_id": "4369",
"_score": 20.680058,
"_source": {
   "firstname": "F",
   "lastname": "F"
 }

находится сверху:

"_index": "clients",
"_type": "client",
"_id": "212360",
_score": 9.230003,
"_source": {
   "firstname": "Ronan",
   "lastname": "Fily"
}

Для меня второй результат должен иметь лучший ранг, чем первый.

Может ли кто-нибудь показать мне, как я могу добиться желаемого результата?

Для информации, я не могу использовать функцию Completion Suggester в elasticsearch, потому что я не могу получить доступ к конфигурации базы данных (поэтому нет индексов).


person toto1911    schedule 19.02.2020    source источник
comment
Можете ли вы переиндексировать свои данные, если мы будем использовать общий анализатор?   -  person LeBigCat    schedule 19.02.2020
comment
Да, возможно. Если я правильно понимаю, elasticsearch предлагает возможность создать несколько анализаторов, которые можно передать в качестве аргумента запроса, и каждый анализатор может повлиять на результат запроса. Извините, это похоже на мои первые 2 дня с elasticsearch, мне нужно найти несколько учебных пособий.   -  person toto1911    schedule 20.02.2020
comment
@ toto1911, ты смог решить проблему? или все еще ищете ответ?   -  person user156327    schedule 05.03.2020
comment
Да мне удается оптимизировать свой запрос без использования нового анализатора, я закрою пост   -  person toto1911    schedule 06.03.2020


Ответы (1)


Хорошо, поскольку вы можете переиндексировать свои данные, я присоединяюсь к anylyzer «начать с». Он будет работать без регистра и в текстовом поле (я думаю, что имя и фамилия могут содержать несколько слов).

Удалить/создать новый индекс с помощью сопоставлений.

определите свой анализатор (PUT my_index) { "settings": {:

"filter": {
        "name_ngrams": {
            "max_gram": "20",
            "type": "edgeNGram",
            "min_gram": "1",
            "side": "front"
        }
    },
    "analyzer": {
        "partial_name": {
            "type": "custom",
            "filter": [
                "lowercase"
                ,
                "name_ngrams"
                ,
                "standard"
                ,
                "asciifolding"
            ],
            "tokenizer": "standard"
        },
        "full_name": {
            "type": "custom",
            "filter": [
                "standard"
                ,
                "lowercase"
                ,
                "asciifolding"
            ],
            "tokenizer": "standard"
        }
    }

опубликуйте _mappings, используя это для своих полей:

"lastname": {
        "type": "text",
        "analyzer": "partial_name",
        "search_analyzer": "full_name"

},

    "firstname": {
        "type": "text",
        "analyzer": "partial_name",
        "search_analyzer": "full_name"
}

если это неясно и документация elasticsearch не может вам помочь, не стесняйтесь спрашивать нас.

person LeBigCat    schedule 20.02.2020