ElasticSearch - 聚合+范围+术语查询

Swa*_*vil 2 elasticsearch

使用 ElasticSearch,我想获取一段时间内某个字段的总和,并过滤其他字段的值。

我定义了这个映射:

PUT match-orders
{
    "settings" : {
        "number_of_shards" : 1,
        "number_of_replicas" : 0
    },
    "mappings": {
        "order": {
            "_all": {"enabled": false},
            "properties": {
                "matchTime": {"type": "date", "index": "true"},
                "product_id": {"type": "keyword", "index": "true"},
                "size": {"type": "float", "index": "true"},
                "price": {"type": "float", "index": "true"},
                "side": {"type": "keyword", "index": "true"}
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以得到一个范围的总和:

POST /match-orders/_search?pretty
{
    "aggs" : {
    "price_ranges" : {
            "range" : {
                "field" : "matchTime",
                "ranges" : [
                    { "from" : "2017-09-10T18:00:00Z", "to" : "2017-09-10T18:15:00Z" }
                ]
            },
            "aggs" : {
                "result" : { "sum" : { "field" : "size" } }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

我可以获得包含特定术语的文档:

POST /match-orders/_search?pretty
{
    "query": {
        "term" : { "side" : "sell" } 
    }
}
Run Code Online (Sandbox Code Playgroud)

但是我怎样才能结合这两个查询呢?

谢谢 :)

Val*_*Val 5

您只需将查询与聚合合并,如下所示:

POST /match-orders/_search?pretty
{
    "query": {
        "term" : { "side" : "sell" } 
    },
    "aggs" : {
        "price_ranges" : {
            "range" : {
                "field" : "matchTime",
                "ranges" : [
                    { "from" : "2017-09-10T18:00:00Z", "to" : "2017-09-10T18:15:00Z" }
                ]
            },
            "aggs" : {
                "result" : { "sum" : { "field" : "size" } }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)