Elasticsearch分组并拾取具有最大时间戳的文档

时间:2019-07-16 19:35:49

标签: java scala elasticsearch group-by

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

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

{
  "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条消息或文档,其中ID超过3。 其中,我只需要那些时间戳为最新的文档

我正在尝试进行一些汇总,但没有帮助。 要获取唯一的最新文档应该怎么做?

我尝试过这样的事情:

{
  "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": []
        }
    }

这里缺少什么?

1 个答案:

答案 0 :(得分:0)

应该不是

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

代替

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