Поиск по имени в ElasticSearch

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

John Anders John Smith Sarah Smith Bjarne Stroustrup

Я хочу иметь на нем полные возможности поиска, а это значит, что:

  1. Если я ищу John, я должен получить John Anders и John Smith.

  2. Если я буду искать Smith, я должен найти пару Смитов.

  3. Если я ищу sarasmit или sara smit, я должен получить Sarah Smith, поскольку я искал инициалы имени, а пробел не имеет значения.

  4. Если я ищу johers или joh ers, я должен получить John Anders, поскольку я искал строки, содержащиеся в имени.

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

Какую комбинацию токенизаторов/анализаторов/запросов следует использовать?


person greenboxal    schedule 13.04.2014    source источник


Ответы (1)


Взгляните на это, это вопрос, который я задал относительно аналогичного набора данных. Вот посмотрите на настройки/отображение индекса, которые я использовал для получения приличных результатов. Разработка временно приостановлена, но это то, что я сделал до сих пор. Затем вы можете разработать свои запросы -

{
    "settings": {
         "number_of_shards": 5,
         "number_of_replicas": 0,
         "analysis": {
             "filter": {
                "synonym": {
                    "type": "synonym",
                    "synonyms_path": "synonyms/synonyms.txt"
                },
                "my_metaphone": {
                    "type": "phonetic",
                    "encoder": "metaphone",
                    "replace": false
                }
            },
             "analyzer": {
                "synonym": {
                    "tokenizer": "whitespace",
                    "filter": [
                         "lowercase",
                         "synonym"
                     ]
                 },
                 "metaphone": {
                     "tokenizer": "standard",
                     "filter": [
                         "my_metaphone"
                    ]
                },
                "porter": {
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase",
                        "porter_stem"
                    ]
                }
            }
        }
    },
    "mappings": {
        "mes": {
            "_all": {
                "enabled": false
            },
            "properties": {
                "pty_forename": {
                    "type": "multi_field",
                    "store": "yes",
                    "fields": {
                        "pty_forename": {
                            "type": "string",
                            "analyzer": "simple"
                        },
                        "metaphone": {
                            "type": "string",
                            "analyzer": "metaphone"
                        },
                        "porter": {
                            "type": "string",
                            "analyzer": "porter"
                        },
                        "synonym": {
                            "type": "string",
                            "analyzer": "synonym"
                        }
                     }
                },
                "pty_full_name": {
                    "type": "string",
                    "index": "not_analyzed",
                    "store": "yes"
                },
                "pty_surname": {
                    "type": "multi_field",
                    "store": "yes",
                    "fields": {
                        "pty_surname": {
                            "type": "string",
                            "analyzer": "simple"
                        },
                        "metaphone": {
                            "type": "string",
                            "analyzer": "metaphone"
                        },
                        "porter": {
                            "type": "string",
                            "analyzer": "porter"
                        },
                        "synonym": {
                            "type": "string",
                            "analyzer": "synonym"
                        }
                    }
                }
            }
        }
    }
}'

Примечание. Я использовал фонетический плагин, а также у меня есть полный список синонимов, который имеет решающее значение для возврата результатов для richard при вводе dick.

person Nathan Smith    schedule 14.04.2014