elasticsearch - 按小时返回的Elasticsearch聚合返回重复的小时数

标签 elasticsearch

我根据字段acctstarttime在ES中进行了以下查询,以返回具有更多访问次数的HOURS。

但是,由于我有超过一天的相同小时数,因此会返回相同的小时数2倍,这是您的COUNT时预期的1小时结果。

查询:

{
    "size" : 0,
    "query" : {
        "filtered" : {
            "query": {
                    "match": { "client_id" : 1 }
            },
            "filter" : {
                "bool" : {
                    "must" : [
                        {
                            "range" : {
                                "acctstarttime" : {
                                    "gte" : "2016-05-01 00:00:00",
                                    "lte" : "2016-06-02 23:59:59"
                                }
                            }
                        }
                    ]
                }
            }
        }
    },
    "aggs" : {
        "visits_per_hour" : {
            "date_histogram" : {
                "field" : "acctstarttime",
                "interval" : "hour",
                "format" : "HH"
            }
        }
    }
}

结果:
"aggregations": {
    "visits_per_hour": {
        "buckets": [
            {
                "key_as_string": "17",
                "key": 1463763600000,
                "doc_count": 6
            },
            {
                "key_as_string": "18",
                "key": 1463767200000,
                "doc_count": 3
            },
            {
                "key_as_string": "22",
                "key": 1464127200000,
                "doc_count": 1
            },
            {
                "key_as_string": "22",
                "key": 1464300000000,
                "doc_count": 2
            },
            {
                "key_as_string": "22",
                "key": 1464559200000,
                "doc_count": 1
            }
        ]
    }
}

预期:
"aggregations": {
    "visits_per_hour": {
        "buckets": [
            {
                "key_as_string": "17",
                "key": 1463763600000,
                "doc_count": 6
            },
            {
                "key_as_string": "18",
                "key": 1463767200000,
                "doc_count": 3
            },
            {
                "key_as_string": "22",
                "key": 1464127200000,
                "doc_count": 4
            }
        ]
    }
}

最佳答案

您有两种解决方案

  • 您在索引编制时添加了另一个字段hour,并在该字段上聚合
  • 您使用了一个小的script,它将提取小时并对其进行汇总(注意:您需要enable dynamic scripting)

  • 第一个解决方案是首选的解决方案,因为它将具有更高的性能。

    第二种解决方案如下所示:
    {
      "size": 0,
      "aggs": {
        "visits_per_hour": {
          "histogram": {
            "script": "doc.acctstarttime.date.getHourOfDay()",
            "interval": 1,
            "order": {
              "_key": "desc"
            }
          }
        }
      }
    }
    

    关于elasticsearch - 按小时返回的Elasticsearch聚合返回重复的小时数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37599303/

    相关文章:

    elasticsearch - 如何删除Elasticsearch中超出特定时间轴的文档?

    elasticsearch - 如何在Elasticsearch上省略空格

    elasticsearch - ElasticSearch过滤器无法使用must AND must_not

    elasticsearch - elasticsearch 7 中的同义词聚合 - 基于术语

    elasticsearch - 在 Elasticsearch 中计数不同

    couchdb - ElasticSearch和Couchdb View

    elasticsearch - 如何在Elasticsearch查询中用具体的日期时间替换 “now”?

    elasticsearch - ElasticSearch查询嵌套对象无法按预期工作

    php - Elasticsearch(PHP)多范围过滤器问题

    elasticsearch - bool 查询中嵌入的查询字符串