如何使用Elasticsearch查询获取每个组的最新值?

Eli*_*les 34 elasticsearch

我有一些索引在Elasticsearch上的文档,看起来像这些样本:

{'country': 'France', 'collected': '2015-03-12', 'value': 20}
{'country': 'Canada', 'collected': '2015-03-12', 'value': 21}
{'country': 'Brazil', 'collected': '2015-03-12', 'value': 33}
{'country': 'France', 'collected': '2015-02-01', 'value': 10}
{'country': 'Canada', 'collected': '2015-02-01', 'value': 11}
{'country': 'Mexico', 'collected': '2015-02-01', 'value': 9}
...
Run Code Online (Sandbox Code Playgroud)

我想构建一个查询,每个国家获得一个结果,只获得那些max(collected).

因此,对于上面显示的示例,结果将类似于:

{'country': 'France', 'collected': '2015-03-12', 'value': 20}
{'country': 'Canada', 'collected': '2015-03-12', 'value': 21}
{'country': 'Brazil', 'collected': '2015-03-12', 'value': 33}
{'country': 'Mexico', 'collected': '2015-02-01', 'value': 9}
Run Code Online (Sandbox Code Playgroud)

我意识到我需要进行聚合country,但是我无法理解如何限制结果max(collected).

有任何想法吗?

Dan*_*ery 52

您可以使用top_hits在该country字段上分组的聚合,每组返回1个doc,并按收集的日期降序对文档进行排序:

POST /test/_search?search_type=count
{
    "aggs": {
        "group": {
            "terms": {
                "field": "country"
            },
            "aggs": {
                "group_docs": {
                    "top_hits": {
                        "size": 1,
                        "sort": [
                            {
                                "collected": {
                                    "order": "desc"
                                }
                            }
                        ]
                    }
                }
            }
        }
    }
}
Run Code Online (Sandbox Code Playgroud)