复杂的ElasticSearch查询

时间:2018-01-15 08:46:38

标签: elasticsearch

我有(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是我需要的东西并将它们组合在一起。

1 个答案:

答案 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"
          }
        }
      }
    }
  }
}

我写了它,所以它匹配所有记录,显然返回的数据超出了你的需要。根据数据量,可能更容易在客户端完成任务。