是否有可能对弹性搜索中的热门命中结果进行聚合?

时间:2017-12-20 20:46:37

标签: elasticsearch count grouping aggregation

我基本上需要根据orderId对结果进行分组,并根据修改的时间获取每个订单的最新记录。 我使用热门命中并将大小限制为1来完成此操作,我能够获得最新修改时间的记录。 我无法做的是: 我想根据订单状态(如已处理,已发货等)对此热门点击聚合的结果进行分组,并获取每个州的计数。

所以我期待这样的事情: { 状态:处理 数:2 } { 状态:进程内, 数:4 }

我的聚合是:

   "aggregations":{
  "aggs": {
    "terms": {
            "field": "orderId"
        },

    "aggs": {
            "top_hits_modifiedTime": {
                "top_hits": {
                    "sort": [
                        {
                            "modifiedTime": {
                                "order": "desc"
                            }
                        }
                    ],
                "size" : 1
                }
            }
        }
}}

1 个答案:

答案 0 :(得分:0)

是的,可能是因为我遇到了同样的问题,所以我在嵌套聚合中提出了一种解决方案。在此,我们可以在modifiedTime上添加最大聚合的并行聚合。然后根据您添加的最大聚合对其进行排序。您只需要根据您在第一级上的汇总来调整订单对帐单即可。

通过这种方法,您将在ModifyedTime之前获得热门歌曲排行。热门之后,您将基于与max聚合平行的top_hits聚合对所有存储桶进行排序

请查看以下查询:

{
    "aggregations": {
        "aggs": {
            "terms": {
                "field": "orderId",
                "order": {
                    "max_modifiedTime": "asc"
                }
            },
            "aggs": {
                "top_hits_modifiedTime": {
                    "top_hits": {
                        "sort": [
                            {
                                "modifiedTime": {
                                    "order": "desc"
                                }
                            }
                        ],
                        "size": 1
                    }
                },
                "max_modifiedTime": {
                    "max": {
                        "field": "modifiedTime"
                    }
                }
            }
        }
    }
}

希望这可以解决您的问题。请尝试让我知道是否对您来说还好。