如何在Elasticsearch中按小时无天分组文档?

时间:2018-09-05 14:27:30

标签: elasticsearch elasticsearch-aggregation date-histogram

我有一个应用程序,它每天都会由用户询问一项调查,我希望获得平均回答时间。我尝试了一些请求,但无法按小时对所有文档进行分组,而是按小时对分组。

我这样做:

{
 "aggs": {
      "byHour": {
          "date_histogram": {
              "field": "date",
              "interval": "hour",
              "format" : "H"

                }
            }
        }
    }
}

它是按小时包装的,也按日期包装的,我希望day被忽略。

 [
        {
          "key_as_string": "0",
          "key": 1533945600000,
          "doc_count": 40,
          "group_by_state": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": []
          }
        },
        {
          "key_as_string": "1",
          "key": 1533949200000,
          "doc_count": 345,
          "group_by_state": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": []
          }
        },
        {
          "key_as_string": "23",
          "key": 1534028400000,
          "doc_count": 15,
          "group_by_state": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": []
          }
        },
        {
          "key_as_string": "0",
          "key": 1534032000000,
          "doc_count": 0,
          "group_by_state": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": []
          }
        },
        {
          "key_as_string": "1",
          "key": 1534035600000,
          "doc_count": 2,
          "group_by_state": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": []
          }
        },
        {
          "key_as_string": "2",
          "key": 1534039200000,
          "doc_count": 3,
          "group_by_state": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": []
          }
        }
 ]

映射类型

{
  "myIndex": {
    "mappings": {
      "answer": {
        "properties": {
          "date": {
            "type": "date"
          },
          "lang": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "level": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "offset": {
            "type": "long"
          },
          "patientCaretrackId": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "protocolId": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "query": {
            "properties": {
              "constant_score": {
                "properties": {
                  "filter": {
                    "properties": {
                      "bool": {
                        "properties": {
                          "must": {
                            "properties": {
                              "term": {
                                "properties": {
                                  "questionId": {
                                    "type": "text",
                                    "fields": {
                                      "keyword": {
                                        "type": "keyword",
                                        "ignore_above": 256
                                      }
                                    }
                                  },
                                  "questionnaireId": {
                                    "type": "text",
                                    "fields": {
                                      "keyword": {
                                        "type": "keyword",
                                        "ignore_above": 256
                                      }
                                    }
                                  }
                                }
                              }
                            }
                          }
                        }
                      }
                    }
                  }
                }
              }
            }
          },
          "questionId": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "questionnaireId": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "surgeonId": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            }
          },
          "value": {
            "type": "text",
            "fields": {
              "keyword": {
                "type": "keyword",
                "ignore_above": 256
              }
            },
            "fielddata": true
          }
        }
      }
    }
  }
}

文件示例:

[
{
          "date": "2018-09-11T00:00:00.000Z",
          "lang": "fr",
          "level": "red",
          "offset": 21,
          "patientCaretrackId": "5b894b10a9f7afec73762113",
          "protocolId": "ptg-koos-long-v1",
          "questionnaireId": "j21",
          "surgeonId": "699362de-f040-4799-b1ea-53f5b4a2fe03",
          "value": "permanentes",
          "questionId": "frequence-douleur-2"
},
{
          "date": "2018-09-11T00:00:00.000Z",
          "lang": "fr",
          "level": "red",
          "offset": 21,
          "patientCaretrackId": "5b894b10a9f7afec73762113",
          "protocolId": "ptg-koos-long-v1",
          "questionnaireId": "j21",
          "surgeonId": "699362de-f040-4799-b1ea-53f5b4a2fe03",
          "value": "permanentes",
          "questionId": "frequence-douleur-2"
        }
]

可以通过查询Elasticsearch来做到这一点吗?

谢谢

2 个答案:

答案 0 :(得分:0)

您可以将terms聚合与脚本一起使用:

https://www.elastic.co/guide/en/elasticsearch/reference/current/search-aggregations-bucket-terms-aggregation.html#search-aggregations-bucket-terms-aggregation-script

GET /_search
{
    "aggs" : {
        "hours" : {
            "terms" : {
                "script" : {
                    "source": "doc['date'].getHour()",
                    "lang": "painless"
                }
            }
        }
    }
}

(只是给您一个想法,根本不确定脚本本身..)

答案 1 :(得分:0)

我找到了

{
	"size": 0,
 "aggs": {
      "byHour": {
          "date_histogram": {
              "field": "date",
              "interval": "hour",
              "format" : "H",
              "keyed": true,
              "time_zone": "+02:00"
                }
            }
        }
}

响应:

{
    "took": 9,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 2796,
        "max_score": 0,
        "hits": []
    },
    "aggregations": {
        "byHour": {
            "buckets": {
                "17": {
                    "key_as_string": "17",
                    "key": 1536159600000,
                    "doc_count": 2006
                },
                "18": {
                    "key_as_string": "18",
                    "key": 1536163200000,
                    "doc_count": 790
                }
            }
        }
    }
}