elasticsearch 执行搜索时仅获取文档的最新版本(自定义字段)

ac1kyiln  于 2022-11-28  发布在  ElasticSearch
关注(0)|答案(1)|浏览(182)

我正在使用JavaAPI进行ElasticSearch,并且在执行搜索时试图只获取每个文档的最新版本(这是一个自定义字段)。
例如:

{ id: 1, name: "John Greenwood", version: 1}
{ id: 1, name: "John Greenwood", version: 2}
{ id: 2, name: "John Underwood", version: 1}

当我和约翰一起搜寻时,我想要这个结果:

{ id: 1, name: "John Greenwood", follower_count: 2}
{ id: 2, name: "John Underwood", follower_count: 1}

显然,我应该使用聚合,但我不确定如何在JavaAPI中使用它们。另外,我如何重新分组具有ID的文档?因为我只需要相同ID的最新版本

dxxyhpgq

dxxyhpgq1#

Tldr;

是的,你的思路是对的。
您将需要对每个用户的id进行聚合。然后根据版本获取top_hit

溶液

第一个聚合per_id是按用户的id对用户进行分组,然后在此聚合内执行另一个聚合。lastest_version将选择关于版本的最佳命中。我选择size: 1以获得每组的前1名。

GET 74550367/_search
{
  "query": {
    "match_all": {}
  },
  "aggs": {
    "per_id": { 
      "terms": {
        "field": "id"
      },
      "aggs": {
        "lastest_version": {
          "top_hits": {
            "sort": [
              {
                "version": {
                  "order": "desc"
                }
              }
            ],
            "size": 1
          }
        }
      }
    }
  }
}

重现

POST _bulk
{ "index": {"_index":"74550367"}}
{ "id": 1, "name": "John Greenwood", "version": 1}
{ "index": {"_index":"74550367"}}
{ "id": 1, "name": "John Greenwood", "version": 2}
{ "index": {"_index":"74550367"}}
{ "id": 2, "name": "John Underwood", "version": 1}

相关问题