多个字段的ElasticSearch映射

时间:2017-06-22 02:29:30

标签: elasticsearch

目前我正在使用动态模板,如下所示,这里我将n-gram分析器应用于所有" String"领域。 但是为了提高效率,我想仅在特定字段上应用n-gram,而不是在所有字符串字段上应用n-gram。

{
        "template": "*",
        "settings": {
            "analysis": {
                "filter": {
                    "ngram_filter": {
                        "type": "ngram",
                        "min_gram": 1,
                        "max_gram": 25
                    }
                },
                "analyzer": {
                    "case_insensitive": {
                        "tokenizer": "whitespace",
                        "filter": [
                            "ngram_filter",
                            "lowercase"
                        ]
                    },
                    "search_analyzer": {
                        "type": "custom",
                        "tokenizer": "whitespace",
                        "filter": "lowercase"
                    }
                }
            }
        },
        "mappings": {
            "my_type": {
                "dynamic_templates": [
                    {
                        "strings": {
                            "match_mapping_type": "string",
                            "mapping": {
                                "type": "string",
                                "fields": {
                                    "keyword": {
                                        "type": "keyword",
                                        "ignore_above": 256
                                    }
                                },
                                "analyzer": "case_insensitive",
                                "search_analyzer": "search_analyzer"
                            }
                        }
                    }
                ]
            }
        }
    }

我有这样的有效载荷:

{
   "userId":"abc123-pqr180-xyz124-njd212",
   "email" : "someuser@test.com",
   "name"  : "somename",
   .
   .
   20 more fields
}

现在我想仅为"电子邮件"应用n-gram。和"用户ID"。 我们应该怎么做 ?

1 个答案:

答案 0 :(得分:1)

由于您无法重命名字段,我建议使用以下解决方案,即复制nameemail字段的动态模板。

{
        "template": "*",
        "settings": {
            "analysis": {
                "filter": {
                    "ngram_filter": {
                        "type": "ngram",
                        "min_gram": 1,
                        "max_gram": 25
                    }
                },
                "analyzer": {
                    "case_insensitive": {
                        "tokenizer": "whitespace",
                        "filter": [
                            "ngram_filter",
                            "lowercase"
                        ]
                    },
                    "search_analyzer": {
                        "type": "custom",
                        "tokenizer": "whitespace",
                        "filter": "lowercase"
                    }
                }
            }
        },
        "mappings": {
            "my_type": {
                "dynamic_templates": [
                    {
                        "names": {
                            "match_mapping_type": "string",
                            "match": "name",
                            "mapping": {
                                "type": "string",
                                "fields": {
                                    "keyword": {
                                        "type": "keyword",
                                        "ignore_above": 256
                                    }
                                },
                                "analyzer": "case_insensitive",
                                "search_analyzer": "search_analyzer"
                            }
                        }
                    },
                    {
                        "emails": {
                            "match_mapping_type": "string",
                            "match": "email",
                            "mapping": {
                                "type": "string",
                                "fields": {
                                    "keyword": {
                                        "type": "keyword",
                                        "ignore_above": 256
                                    }
                                },
                                "analyzer": "case_insensitive",
                                "search_analyzer": "search_analyzer"
                            }
                        }
                    }
                ]
            }
        }
    }