Elasticsearch动态模板不使用嵌套文档

时间:2013-09-06 16:41:43

标签: elasticsearch

我真的以为我有这个工作,但我实际上遇到了问题。我有一个动态模板设置来匹配嵌套文档。我设置了这样的映射:

curl -XPUT 'http://localhost:9200/test/' -d '{
    "mappings": {
        "Item": {
            "dynamic_templates": [
                {
                    "metadata_template": {
                        "match_mapping_type": "string",
                        "path_match": "metadata.*",
                        "mapping": {
                            "type": "multi_field",
                            "fields": {
                                "{name}": {
                                    "type": "{dynamic_type}",
                                    "index": "analyzed"
                                },
                                "standard": {
                                    "type": "{dynamic_type}",
                                    "index": "analyzed",
                                    "analyzer" : "standard"
                                }
                            }
                        }
                    }
                }
            ]
        }
    },
    "settings": {
        "analysis": {
            "filter": {
                "my_ngram": {
                    "max_gram": 10,
                    "min_gram": 1,
                    "type": "nGram"
                },
                "lb_stemmer": {
                    "type": "stemmer",
                    "name": "english"
                }
            },
            "analyzer": {
                "default_index": {
                    "filter": [
                        "standard",
                        "lowercase",
                        "asciifolding",
                        "my_ngram"
                    ],
                    "type": "custom",
                    "tokenizer": "keyword"
                },
                "default_search": {
                    "filter": [
                        "standard",
                        "lowercase"
                    ],
                    "type": "custom",
                    "tokenizer": "standard"
                }
            }
        }
    }
}'

我的期望是所有以“元数据”开头的字段。应存储在已分析的字段中以及带有后缀“.standard”的未分析字段中。我完全误解了这个吗?

我添加了一个项目:

curl -XPUT localhost:9200/test/Item/1 -d '{
                           "name" : "test", 
                           "metadata" : {
                                "strange_tag" : "CLEAN_2C_abcdefghij_07MAY2005_AB" 
                                }
                            }'

此查询效果很好:

{
    "query": {
        "match": {
            "metadata.strange_tag": {
                "query": "CLEAN_2C_abcdefghij_07MAY2005_AB",
                "type": "boolean"
            }
        }
    }
}

但是搜索“清洁”或“清洁”这个词并不会返回任何结果。我希望该字段已经通过了ngram tokenizer。有人建议我做错了吗?

1 个答案:

答案 0 :(得分:1)

看起来我想错误地创建了我的NGRAM分析器。这是一个有效的例子:

curl -XDELETE 'localhost:9200/test'

    curl -XPUT 'localhost:9200/test' -d '{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_ngram_analyzer": {
                    "tokenizer": "my_ngram_tokenizer",
                    "filter": [
                        "standard",
                        "lowercase",
                        "asciifolding"
                    ]
                }
            },
            "tokenizer": {
                "my_ngram_tokenizer": {
                    "type": "nGram",
                    "min_gram": "2",
                    "max_gram": "3",
                    "token_chars": [
                        "letter",
                        "digit"
                    ]
                }
            }
        }
    },
    "mappings": {
        "Item": {
            "dynamic_templates": [
                {
                    "metadata_template": {
                        "match_mapping_type": "string",
                        "path_match": "*",
                        "mapping": {
                            "type": "multi_field",
                            "fields": {
                                "{name}": {
                                    "type": "{dynamic_type}",
                                    "index": "analyzed",
                                    "analyzer" : "my_ngram_analyzer"
                                },
                                "standard": {
                                    "type": "{dynamic_type}",
                                    "index": "analyzed",
                                    "analyzer": "standard"
                                }
                            }
                        }
                    }
                }
            ]
        }
    }
}'