获得每个字段的最旧值

时间:2015-05-07 19:40:30

标签: elasticsearch

我有一个弹性搜索索引,其中包含一组文档,这些文档的截止日期是日期时间字段,帐户ID,其他各种字段以及其doc id的UUID。

我想向elasticsearch发出一个查询,该查询为我提供了每个帐户ID最早到期日的文档。这是我要发送的查询,以获取索引中包含10个最旧项目的帐户ID。这个查询不允许我翻阅结果,我很好奇,如果有人知道我会编写这个查询的方式(可能是最高命中聚合),这将允许我翻阅这些结果?

{
  'query': {
    'match_all': {

    }
  },
  'aggs': {
    'account_id': {
      'terms': {
        'field': 'account_id',
        'size': 10,
        'order' : { "min_due_date" : "asc" }
      },
      'aggs': {
        'min_due_date': {
          'min': {
            'field': 'due_date'
          }
        }
      }
    }
  }
}

今天,我们将每个帐户中最早的截止日期存储在我们手动必须保持更新的单独索引中。如果我能通过实时查询来实现弹性搜索,那就太好了。

感谢。

1 个答案:

答案 0 :(得分:0)

您无法翻阅聚合。页面匹配的能力要求按需重新计算这些命中,对于桶也是如此。

所以,如果你需要第11到第20次命中,那么你需要确定前20名,然后扔掉前10名。对于21到30次命中,你需要确定前30名,然后扔掉顶部20.这一直持续到你停止传呼为止。

对于不使用聚合的普通搜索,您可以使用扫描和滚动来解决此问题,但是您无法进行排序。这肯定是一种权衡,但是从cost of deep paging保存群集的健康状况是值得的。

就汇总而言,分页成本非常高。聚合是一个昂贵的问题(大规模),因此允许对其进行分页会有问题。因此,解决该问题的方法是提前请求适当的大小 - 一次承担负担而不是多次承担负担。唯一真正的变化是维护相​​关分片大小所做的后台工作;处理仍然发生在任何地方。因此,实际成本是:增加网络开销(发送每个分片的前N个以找出实际的前N个)以及处理添加结果的一些额外工作。