在ElasticSearch上按名称搜索

时间:2014-04-13 21:13:55

标签: search elasticsearch fuzzy-search

假设我有一个包含数千个客户名称的索引,我需要能够在管理面板中轻松搜索它们,如下所示:

John Anders John Smith Sarah Smith Bjarne Stroustrup

我想拥有完整的搜索功能,这意味着:

  1. 如果我搜索John,我应该获得John AndersJohn Smith

  2. 如果我搜索Smith,我应该得到史密斯夫妇。

  3. 如果我搜索sarasmitsara smit,我应该Sarah Smith,因为我搜索了名称的缩写,而且空格并不重要。< / p>

  4. 如果我搜索johersjoh ers,我会在搜索名称中包含的字符串时获得John Anders

  5. 我已经发现我可以使用带有小写过滤器和关键字标记器的分析器,但它们不适用于每种情况。

    要使用的令牌化器/分析器/查询的正确组合是什么?

1 个答案:

答案 0 :(得分:0)

看一下this,这是一个我问过类似数据集的问题。下面是我用来产生一些不错结果的索引设置/映射。在过渡期间,发展已经停止,但这是我迄今为止所制作的。然后,您可以开发查询 -

{
    "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的结果至关重要。