首页 > 解决方案 > Elasticsearch 分组并提取具有最大时间戳的文档

问题描述

我正在使用 Elasticsearch 6.5。我正在寻找具有某些过滤条件的文档(工作正常),然后我只需要获取具有 MAX 时间戳的文档(文档中的字段)。

基本上,当我使用下面的有效负载搜索索引时,我得到如下所示的数据(仅显示重要字段,数据有其他字段和内容)

{
  "query": {
        "bool": {
            "must": [
                {
                    "match": { "myfield.date" : "2019-07-02" }
                },
                {
                    "match": { "myfield.data" : "ABC" }
                },
                {
                    "bool": {
                        "should": [
                            {
                                "regexp": { "myOtherFieldId": "myregex1" }
                            },
                            {
                                "regexp": { "myOtherFieldId": "myregex2" }
                            }
                        ]
                    }
                }
            ]
        }
    }
}

基本上,我得到了以下文档。

date, book, id, timestamp
2019-07-02, ABC, PQR_20190703130000_1234, 2019-07-03 13:01:00
2019-07-02, ABC, PQR_20190703140000_234, 2019-07-03 14:01:00
2019-07-02, ABC, PQR_20190704100000_0199, 2019-07-04 10:01:00

总共有大约 1200 条消息或文档,具有 3 个以上的 Id。其中,我只需要那些时间戳为 latest 的文档

我正在尝试进行一些聚合,但没有帮助。应该怎么做才能获得唯一的最新文档?

我试过这样的事情:

{
  "query": {
        "bool": {
            "must": [
                {
                    "match": { "myfield.date" : "2019-07-02" }
                },
                {
                    "match": { "myfield.data" : "ABC" }
                },
                {
                    "bool": {
                        "should": [
                            {
                                "regexp": { "myOtherFieldId": "myregex1" }
                            },
                            {
                                "regexp": { "myOtherFieldId": "myregex2" }
                            }
                        ]
                    }
                }
            ]
        }
    },
"aggs": {
    "group_by_id" : {
        "terms": { 
            "field": "field1.Id"
        },
        "aggs": {
            "timeStamp": {
                "max": { 
                    "field": "field1.Id"
                }
            }
        }
    },
    "max_timestamp": {
        "max_bucket": {
            "buckets_path": "group_by_id>timeStamp"
        }
    }
},
"size": "10000"
}

在这里,我仍在获取所有文件。请注意,映射显示 field1.Id 是关键字。

"Id":{"type":"text","fields":{"keyword":{"type":"keyword","ignore_above":256}}}

检索到的数据显示 MAX 值为 NULL。

"aggregations": {
        "group_by_id": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": "PQR_20190703130000_1234",
                    "doc_count": 947,
                    "timeStamp": {
                        "value": null
                    }
                },
                {
                    "key": "PQR_20190703140000_234",
                    "doc_count": 947,
                    "timeStamp": {
                        "value": null
                    }
                },
                {
                    "key": "PQR_20190704100000_0199",
                    "doc_count": 947,
                    "timeStamp": {
                        "value": null
                    }
                }
            ]
        },
        "max_timestamp": {
            "value": null,
            "keys": []
        }
    }

这里缺少什么?

标签: javascalaelasticsearchgroup-by

解决方案


难道不应该

"aggs": {
    "timeStamp": {
        "max": { 
            "field": "field1.timestamp"
        }
    }
}

代替

"aggs": {
    "timeStamp": {
        "max": { 
            "field": "field1.Id"
        }
    }
}

推荐阅读