【问题标题】:How to get documents in Elasticsearch based on aggregation output values?如何根据聚合输出值在 Elasticsearch 中获取文档?
【发布时间】:2019-05-17 18:01:32
【问题描述】:

我想在一个查询中使用聚合输出作为过滤文档的输入。

例如,我想获取过去 24 小时内销售额大于当月前过去 3 个月的平均销售额的销售文件(例如,如果我们在 5 月,则为 2 月至 4 月)。平均销售额将是一个聚合。

尝试使用脚本字段,因为它会过滤文档,但不确定如何从脚本访问聚合结果。 https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-script-fields.html

另一个想法是在顶部使用 3 个月的日期范围查询,然后有一个 24 小时日期直方图,其中嵌套在下面的热门点击聚合。但是,我需要某种脚本过滤器来根据平均销售额聚合过滤掉文档。

您可以通过 POST 将以下内容导入到Bulk API 的示例销售文件:

{"index":{}}
{"id": 1, "date": "2019-02-01", "amount": 1000}
{"index":{}}
{"id": 2, "date": "2019-03-01", "amount": 2000}
{"index":{}}
{"id": 3, "date": "2019-04-01", "amount": 3000}
{"index":{}}
{"id": 4, "date": "2019-05-17", "amount": 1500}
{"index":{}}
{"id": 5, "date": "2019-05-17", "amount": 4000}
{"index":{}}
{"id": 6, "date": "2019-05-17", "amount": 8000}

根据上面的文档,这个月(5月)之前的最后3M的平均值是(1000 + 2000 + 3000)/3 = 2000。过去24小时内金额> 2000的文档只是id 5,id 6.

在 SQL 中,查询看起来像

SELECT * 
FROM   sales 
WHERE  `date` >= '2019-05-17' 
       AND amount > (SELECT AVG(amount) 
                     FROM   sales 
                     WHERE  `date` BETWEEN '2019-02-01' AND '2019-04-30'); 

然后返回

id  date    amount
5   2019-05-17  4000
6   2019-05-17  8000

如何在一个查询/请求中使用 Elasticsearch 实现相同的目标?

【问题讨论】:

    标签: elasticsearch nosql aggregation querydsl elasticsearch-java-api


    【解决方案1】:

    根据 Elastic 团队成员 Mark Walkom 的说法:

    你现在不能抱歉! ? 您需要运行 agg 来获取平均值,然后运行单独的查询来获取与值匹配的文档。

    https://discuss.elastic.co/t/how-to-get-documents-in-elasticsearch-based-on-aggregation-output-values/182109/2

    【讨论】:

      猜你喜欢
      • 2018-01-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-11-14
      • 2016-04-14
      • 1970-01-01
      相关资源
      最近更新 更多