【问题标题】:Date histogram aggregation Elasticsearch日期直方图聚合 Elasticsearch
【发布时间】:2020-10-07 09:26:28
【问题描述】:

我想从弹性搜索中过滤和获取数据。我尝试过 日期直方图聚合,但它没有解决我的目的。 我有这样的数据:

[
   {
      "id":1,
      "title":"Sample news",
      "date":"2020-09-17",
      "regulation":[
         {
            "id":1,
            "name":"sample name",
            "date":"2020-09-17"
         },
         {
            "id":2,
            "name":"sample name 1",
            "date":"2020-09-18"
         }
      ]
   },
   {
      "id":2,
      "title":"Sample news 1",
      "date":"2020-09-17",
      "regulation":[
         {
            "id":1,
            "name":"sample name",
            "date":"2020-09-18"
         },
         {
            "id":2,
            "name":"sample name 1",
            "date":"2020-09-17"
         }
      ]
   }
]

我想过滤并获取如下数据:

year: {
  month: {
   day: {
    news: int,
    regulations: int,
   }
 }
}

这意味着每天的新闻和法规都算作日期层次结构。 我可以实现这样的数据:

        "2020-09-17" : {
          "key_as_string" : "2020-09-17",
          "key" : 1600300800000,
          "doc_count" : 1
        },
        "2020-09-18" : {
          "key_as_string" : "2020-09-18",
          "key" : 1600387200000,
          "doc_count" : 0
        },
        "2020-09-19" : {
          "key_as_string" : "2020-09-19",
          "key" : 1600473600000,
          "doc_count" : 0
        },

使用

GET /news/_search?size=0
{
  "aggs": {
    "news_over_time": {
      "date_histogram": {
        "field": "date",
        "calendar_interval": "day",
        "keyed": true,
        "format": "yyy-MM-dd"
      }
    }
  }
}

但这并没有解决我的目的。 如何使用 Elasticsearch 和 Elasticsearch dsl 来做到这一点

预期响应: 预期响应:

2020: {
  09: {
   17: {
    news: 2,
    regulation: 2
   },
   18: {
    news: 0,
    regulation: 2
   }
 }
}

【问题讨论】:

  • 你能说得更清楚一点吗?对于上述示例,您将得到什么最终响应?特定日期的新闻数量?
  • 'regulation' 是一个嵌套对象或多值字段。你能分享一下索引映射吗?是否也需要考虑法规日期还是仅新闻日期?
  • @CoderL 我已经更新了我的预期回复。请看一看。
  • @SahilGupta 规则是一个嵌套对象,规则日期也需要计算特定日期的规则。

标签: elasticsearch elasticsearch-dsl elasticsearch-dsl-py


【解决方案1】:

我不确定您的预期响应是什么,但如果您想获得每天的新闻数量,这就是您要查找的请求

GET /news/_search?size=0
{
  "aggs": {
    "news_over_time": {
      "date_histogram": {
        "field": "regulation.date",
        "calendar_interval": "day",
        "format": "yyy-MM-dd"
         }
      }
   }
}

【讨论】:

    【解决方案2】:

    由于新闻日期和监管日期是 2 个不同的字段,其中一个属于父文档,另一个属于嵌套文档。我不完全确定我们可以直接做你所要求的(我自己也在探索)。但是,以下查询也应该适合您。

    GET news/_search
    {
      "size": 0, 
      "aggs": {
        "news_over_time": {
          "date_histogram": {
            "field": "date",
            "calendar_interval": "day",
            "keyed": true,
            "format": "yyy-MM-dd"
          }
        },"regulations_over_time":{
          "nested": {
            "path": "regulation"
          },"aggs": {
            "regulation": {
              "date_histogram": {
                "field": "regulation.date",
                "calendar_interval": "day",
                "keyed": true,
                "format": "yyy-MM-dd"
              }
            }
          }
        }
      }
    }
    

    它将提供以下形式的结果:

    "aggregations" : {
    "regulations_over_time" : { //<=== Regulations over time based on regulationDate
      "doc_count" : 9,
      "regulation" : {
        "buckets" : {
          "2020-09-17" : {
            "key_as_string" : "2020-09-17",
            "key" : 1600300800000,
            "doc_count" : 5
          },
          "2020-09-18" : {
            "key_as_string" : "2020-09-18",
            "key" : 1600387200000,
            "doc_count" : 4
          }
        }
      }
    },
    "news_over_time" : { //<======= news over time based on news date
      "buckets" : {
        "2020-09-17" : {
          "key_as_string" : "2020-09-17",
          "key" : 1600300800000,
          "doc_count" : 2
        },
        "2020-09-18" : {
          "key_as_string" : "2020-09-18",
          "key" : 1600387200000,
          "doc_count" : 2
        }
      }
    }
    }
    }
    

    然后,如果需要,您可以将这 2 个统计信息合并在一起。

    【讨论】:

    • 它部分工作。结果并排出现。谢谢。
    • 我不完全确定你的要求是否可行。如果它适用于您的情况,请接受答案
    • 我不能接受这个答案,因为这不是我想要的答案。
    • 当然......谢谢......如果你得到了你想要的答案,请在这里告诉我们。
    猜你喜欢
    • 2015-01-30
    • 1970-01-01
    • 1970-01-01
    • 2022-07-13
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-12-28
    • 1970-01-01
    相关资源
    最近更新 更多