我有(id,value,modified_date)的文档。需要获取具有截至最后一次modified_date的特定值的ID的所有文档。
我的理解是我首先需要找到这样的ID,然后将它们放在一个更大的查询中。为了找到这样的ID,看起来,我会使用“top_hits”对结果进行一些后置过滤。
目标是在服务器端尽可能多地完成工作以加快速度。在SQL中一定是微不足道的,但是对于ElasticSearch,我很茫然。然后我需要使用elasticsearch_dsl在python中编写它。有人可以帮忙吗?
更新:如果不清楚,“截至上次modified_date具有特定值的ID的所有文档”表示:1。按ID分组,2。在每个组中选择记录最大的modified_date,3。只保留那些具有特定值的记录,4。从这些记录中只保留id,5。获取列表中的id来自4的所有文档。
具体来说,1是聚合,2是使用“top_hits”的另一个聚合和按日期反向排序,3是SQL的HAVING子句的模拟 - Bucket Selector Aggregation(?),4 _source,5 terms-lookup。
到目前为止,我面临的最大挑战是弄清楚Bucket Selector Aggregation是我需要的东西并将它们组合在一起。
答案 0 :(得分:0)
这显示了如何获取每组中最新元素的示例:
How to get latest values for each group with an Elasticsearch query?
这将返回以天为间隔的平均价格:
GET /logstash-*/_search?size=0
{
"query": {
"match_all": {}
},
"aggs": {
"2": {
"date_histogram": {
"field": "@timestamp",
"interval": "1d",
"time_zone": "Europe/Berlin",
"min_doc_count": 1
},
"aggs": {
"1": {
"avg": {
"field": "price"
}
}
}
}
}
}
我写了它,所以它匹配所有记录,显然返回的数据超出了你的需要。根据数据量,可能更容易在客户端完成任务。