elasticsearch按最大日期查询

0dxa2lsx  于 2021-06-14  发布在  ElasticSearch
关注(0)|答案(1)|浏览(351)

我有一个只附加的索引。每次更改都会与日期属性一起保存为新文档。为了获取当前的活动数据,我需要按id对所有实体进行分组,并获取最新日期的实体。应该可以为该日期添加筛选器。我一直在玩聚合,但我陷入了滚动api。
数据示例(注意:id是guid,日期是unix时间戳,这里使用其他值使其更清晰)

{"id": "<entityId_date>", "entityId", 1, "date": "2020-05-10", "value": { <JSON document> } }, 
   {"id": "<entityId_date>", "entityId", 1, "date": "2020-06-10", "value": { <JSON document> } }, 
   {"id": "<entityId_date>", "entityId", 2, "date": "2020-04-10", "value": { <JSON document> } }, 
   {"id": "<entityId_date>", "entityId", 2, "date": "2020-08-10", "value": { <JSON document> } },
   {"id": "<entityId_date>", "entityId", 3, "date": "2020-07-10", "value": { <JSON document> } }

要求的结果:

{"id": "<entityId_date>", "entityId", 1, "date": "2020-06-10", "value": { <JSON document> } }, 
   {"id": "<entityId_date>", "entityId", 2, "date": "2020-08-10", "value": { <JSON document> } },
   {"id": "<entityId_date>", "entityId", 3, "date": "2020-07-10", "value": { <JSON document> } }

尝试了以下查询:

{
  "size": 0,
  "aggs": {
    "id_aggregate": {
      "terms": { 
          "field": "entityId"
       },
      "aggs": {
        "date_aggregate": {
          "top_hits": {
            "sort": [{
                "date.ticks": {
                    "order": "desc"
                }
            }],
            "size": 1
          }
        }
     }
    }
  }
}

我得到的结果是正确的,但是我只得到了前x个结果。我可以设置 id_aggregate ,但可能有成千上万的文件。对于一个普通的搜索查询,我可以使用scrollapi,但是这在聚合中是不可能的。
我已经研究过如何使用分区,但这对我也没有帮助,因为有时文档很少,有时会有负载(这是一种基本查询,我们执行的所有其他查询都将指定其他筛选器)。
我如何构建一个查询来获取文档的最长日期和滚动?

6jjcrrmo

6jjcrrmo1#

可以使用复合aggs分页并保留 top_hits agg仅检索最近的文档:

{
  "size": 0,
  "aggs": {
    "comp_parent": {
      "composite": {
        "sources": [
          {
            "by_id": {
              "terms": {
                "field": "entityId"
              }
            }
          }
        ],
        "size": 10,                          <-- bucket size
        "after": {
          "by_id": "<entityId_date>_xyz"     <-- pagination 'cursor'
        }
      },
      "aggs": {
        "hits": {
          "top_hits": {
            "size": 1,
            "sort": [
              {
                "date.ticks": {
                  "order": "desc"
                }
              }
            ]
          }
        }
      }
    }
  }
}

相关问题