如何根据聚合输出值获取Elasticsearch中的文档?
How to get documents in Elasticsearch based on aggregation output values?
我想使用聚合输出作为输入来过滤一次查询中的文档。
例如,我想获取最近 24 小时内销售额大于当月前最后 3 个月平均销售额的销售文件(例如,如果我们是在五月)。平均销售额将是一个聚合。
尝试使用脚本字段,因为它会过滤文档,但不确定如何从脚本访问聚合结果。 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 , 编号 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');
和return
id date amount
5 2019-05-17 4000
6 2019-05-17 8000
如何使用 Elasticsearch 实现相同的功能 query/request?
根据 Elastic 团队成员 Mark Walkom 的说法:
You can't at the moment sorry!
You will need to run the agg to get the average, then run a separate query to get the docs that match the values.
我想使用聚合输出作为输入来过滤一次查询中的文档。
例如,我想获取最近 24 小时内销售额大于当月前最后 3 个月平均销售额的销售文件(例如,如果我们是在五月)。平均销售额将是一个聚合。
尝试使用脚本字段,因为它会过滤文档,但不确定如何从脚本访问聚合结果。 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 , 编号 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');
和return
id date amount
5 2019-05-17 4000
6 2019-05-17 8000
如何使用 Elasticsearch 实现相同的功能 query/request?
根据 Elastic 团队成员 Mark Walkom 的说法:
You can't at the moment sorry! You will need to run the agg to get the average, then run a separate query to get the docs that match the values.