Elasticsearch对数字字段进行部分匹配

时间:2017-01-18 08:28:04

标签: elasticsearch

我正在尝试部分匹配数字字段。在下面的查询中,我希望id(定义为long)匹配任何以419开头的文档。(所以4191应该匹配,419534应该匹配,但不是123419)

{
    "size": 20,
    "from": 0,
    "sort": [{
        "customerName": "asc"
    }],
    "query": {
        "bool": {
            "must": [{
                "bool": {
                    "should": [{
                        "term": {
                            "id": 419
                        }
                    }]
                }
            }]
        }
    }
}

任何人都可以在我的查询中使用一个简洁的解决方案吗?

2 个答案:

答案 0 :(得分:1)

要避免使用egde ngram,您可以在id映射中声明一个未分析的文本子字段:

"mappings": {
    "default": {
        "properties": {
            "id": {
                "type": "integer",
                "fields": {
                    "prefixed": {
                        "type":  "string",
                        "index":    "not_analyzed"
                    }
                }
            },
            ...
        }
    }
}

并对该字段使用prefix query

"query": {
    "prefix" : { 
        "id.prefixed" :  { "value" : 419 } 
    }
}

答案 1 :(得分:-1)

在字符串字段中,您可以使用通配符查询:

{
"query" : {
    "wildcard" : { "id" : "*419*" }
}
}