_all被忽略的弹性搜索edge_ngram匹配查询

时间:2016-05-06 23:28:51

标签: elasticsearch autocomplete

我正在使用弹性搜索number: "1.5.2",我正在尝试实现edge_ngram自动完成搜索。我有以下映射:

curl -XPUT 'localhost:8080/users' -d '{
    "settings": {
        "analysis": {
            "filter": {
                "edge_ngram_filter": {
                    "type": "edge_ngram",
                    "min_gram": 2,
                    "max_gram": 10
                }
            },
            "analyzer": {
                "edge_ngram_analyzer": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase",
                        "asciifolding",
                        "edge_ngram_filter"
                    ]
                },
                "whitespace_analyzer": {
                    "type": "custom",
                    "tokenizer": "whitespace",
                    "filter": [
                        "lowercase",
                        "asciifolding"
                    ]
                }
            }
        },
        "mappings": {
            "user": {
                "_all": {
                    "type":"string",
                    "index_analyzer": "edge_ngram_analyzer",
                    "search_analyzer": "whitespace_analyzer"
                },
                "properties": {
                    "id":{
                        "type": "integer",
                        "index": "no",
                        "include_in_all":false
                    },
                    "email": {
                        "type": "string"
                    },
                    "firstName": {
                        "type": "string"
                    },
                    "lastName": {
                        "type": "string"
                    }
                }
            }
        }
    }
}'

然后我将“用户”文档编入索引:

curl -XPUT 'localhost:8080/users/user/1' -d '{
    "email": "a.smith@gmail.com",
    "firstName": "Alexander",
    "lastName": "Smith"
}'

当我运行以下查询时,不会返回任何内容:

curl -XGET 'localhost:8080/users/_search' -d '{
    "query": {
        "match":{
            "_all":{
                "query": "ale",
                "operator":"and"
            }
        }
    }
}'

为什么_all匹配查询在用户文档上不匹配?

1 个答案:

答案 0 :(得分:2)

您可以通过edge_ngram实现自动填充功能,而无需覆盖_all字段分析。这是通过将您定义的分析器的名称更改为default_indexdefault_search来完成的(如果您使用alias它们可以反映您的原始名称(“edge_ngram_analyzer”和“whitespace_analyzer”)想)。以下是您的配置以及相关更改:

curl -XPUT 'localhost:8080/users' -d '{
    "settings": {
        "analysis": {
            "filter": {
                "edge_ngram_filter": {
                    "type": "edge_ngram",
                    "min_gram": 2,
                    "max_gram": 10
                }
            },
            "analyzer": {
                "default_index": {
                    "type": "custom",
                    "tokenizer": "standard",
                    "filter": [
                        "lowercase",
                        "asciifolding",
                        "edge_ngram_filter"
                    ]
                },
                "default_search": {
                    "type": "custom",
                    "tokenizer": "whitespace",
                    "filter": [
                        "lowercase",
                        "asciifolding"
                    ]
                }
            }
        },
        "mappings": {
            "user": {
                "properties": {
                    "id":{
                        "type": "integer",
                        "index": "no",
                        "include_in_all":false
                    },
                    "email": {
                        "type": "string"
                    },
                    "firstName": {
                        "type": "string"
                    },
                    "lastName": {
                        "type": "string"
                    }
                }
            }
        }
    }
}'

希望我能帮助:)