在 ElasticSearch 中获取组中的最新记录

Dmi*_*zin 3 elasticsearch

我有以下表结构

change_id    saveDate     id
-------------------------------
1            2014-04-01  205
2            2014-05-01  205
3            2014-03-31  111
4            2014-04-01  111
5            2014-04-01  333
Run Code Online (Sandbox Code Playgroud)

现在我想获取特定 ids = [205, 111] 的最新记录。我应该得到 change_id [2,4] 的记录。

到目前为止,我的 ElasticSearch 查询是:

    {
        "fields": [
            "Something.id",
            "Something.change_id",
            "Something.saveDate"
        ],
        "query": {
            "terms": {
                "Something.id": [
                    "2015",
                    "111"
                ]
            }
        },
        "sort": [
            {
                "Something.saveDate": {
                    "order": "desc"
                }
            }
        ],
        "aggs": {
            "id": {
                "terms": {
                    "field": "Something.id",
                    "size": 20
                }
            }
        }
    }
Run Code Online (Sandbox Code Playgroud)

我得到 4 行 change_id=[2, 1, 4, 3] 的结果,它按 saveDate 对 desc 进行排序。

如何使用查询过滤并获得两行,其中 change_id=[4, 2] ?

Chi*_*h25 7

为此,您可以使用top_hits 聚合。它还具有源过滤和排序功能。

{
  "query": {
    "bool": {
      "filter": {
        "terms": {
          "Something.id": [
            "205",
            "111"
          ]
        }
      }
    }
  },
  "size": 0,
  "aggs": {
    "unique_id": {
      "terms": {
        "field": "Something.id",
        "size": 20
      },
      "aggs": {
        "top_result": {
          "top_hits": {
            "size": 1,
            "_source": ["Something.id", "Something.change_id", "Something.saveDate"],
            "sort": {
              "Something.saveDate" : "desc"
            }
          }
        }
      }
    }
  }
}
Run Code Online (Sandbox Code Playgroud)