Эластичный поиск нескольких полей совпадение нескольких слов - PullRequest
0 голосов
/ 19 февраля 2020

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

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

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

Например:

{
  "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 из эластичного поиска, потому что не могу получить доступ к конфигурации базы данных ( так что никаких индексов).

1 Ответ

0 голосов
/ 20 февраля 2020

Хорошо, так как вы можете переиндексировать свои данные, я присоединяюсь к «начать с» 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"
}

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

...