除非在查询中明确说明,否则Elasticsearch不使用“default_search”分析器

时间:2013-10-07 20:58:42

标签: elasticsearch

通过阅读Elasticsearch文档,我希望命名分析器'default_search'会导致该分析器被用于所有搜索,除非指定了另一个分析器。但是,如果我像这样定义我的索引:

curl -XPUT 'http://localhost:9200/test/' -d '{
    "settings": {
        "analysis": {
            "analyzer": {
                "my_ngram_analyzer": {
                    "tokenizer": "my_ngram_tokenizer",
                    "filter": [
                        "lowercase"
                    ],
                    "type" : "custom"
                },
                "default_search": {
                    "tokenizer" : "keyword",
                    "filter" : [
                        "lowercase"
                    ]
                }
            },
            "tokenizer": {
                "my_ngram_tokenizer": {
                    "type": "nGram",
                    "min_gram": "3",
                    "max_gram": "100",
                    "token_chars": []
                }
            }
        }
    },
    "mappings": {
        "TestDocument": {
            "dynamic_templates": [
                {
                    "metadata_template": {
                        "match_mapping_type": "string",
                        "path_match": "*",
                        "mapping": {
                            "type": "multi_field",
                            "fields": {
                                "ngram": {
                                    "type": "{dynamic_type}",
                                    "index": "analyzed",
                                    "analyzer": "my_ngram_analyzer"
                                },
                                "{name}": {
                                    "type": "{dynamic_type}",
                                    "index": "analyzed",
                                    "analyzer": "standard"
                                }
                            }
                        }
                    }
                }
            ]
        }
    }
}'

然后添加'TestDocument':

curl -XPUT 'http://localhost:9200/test/TestDocument/1' -d '{
    "name" : "TestDocument.pdf" }'

我的查询仍然在默认分析器中运行。我可以说,因为这个查询给了我一个打击:

curl -XGET 'localhost:9200/test/TestDocument/_search?pretty=true' -d '{
    "query": {
         "match": {
                    "name.ngram": {
                        "query": "abc.pdf"
                    }
                }
    }
}'

但如果我指定了正确的分析器(使用'关键字'标记器)

,则不会
curl -XGET 'localhost:9200/test/TestDocument/_search?pretty=true' -d '{
    "query": {
         "match": {
                    "name.ngram": {
                        "query": "abc.pdf",
                        "analyzer" : "default_search"
                    }
                }
    }
}'

除非在我的查询中另有说明,否则我对搜索使用“default_search”缺少什么?我只是误解了预期的行为吗?

1 个答案:

答案 0 :(得分:3)

在动态模板中,您将使用“analyzer”设置搜索和索引分析器。它只会使用默认值作为最后的手段。

"index_analyzer":"analyzer_name" //sets the index analyzer
"analyzer":"analyzer_name" // sets both search and index
"search_analyzer":"...." // sets the search analyzer.