我有类型的文件:
[{"msg":"hello", date: "some-date"},{"msg":"hi!", date: "some-date"}, ...
我希望按周计算文件数量。例如,x消息是在星期一发送的,y是在星期二发送的,依此类推。
我已经将date_histogram与聚合一起使用,但它会在一天之内将文档返回给我。它确实让我回归,但是说“Wed,22”和“Wed,29”将作为单独的汇总文件返回。
这与Elasticsearch - group by day of week and hour有些相关,但对此问题没有答案,所以我重新发布。 根据建议,它要求我在key_as_string上进行术语聚合,但是我需要为每个对象添加doc_count而不是仅计算术语。我也不知道如何在嵌套聚合中使用key_as_string。
这就是我的尝试:
"aggs" : {
"posts_over_days" : {
"date_histogram" : {
"field" : "created_time",
"interval": "day",
"format": "E"
}
}
答案 0 :(得分:4)
this thread已经解决了同样的问题。
根据您的问题调整解决方案,我们需要制作一个脚本,将日期转换为一天中的小时和一周中的某一天:
Date date = new Date(doc['created_time'].value) ;
java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE, HH');
format.format(date)
并在查询中使用它:
{
"aggs": {
"perWeekDay": {
"terms": {
"script": "Date date = new Date(doc['created_time'].value) ;java.text.SimpleDateFormat format = new java.text.SimpleDateFormat('EEE, HH');format.format(date)"
}
}
}
}
答案 1 :(得分:4)
从我的回答中重新发帖:https://stackoverflow.com/a/31851896/6247
这有用吗:
"aggregations": {
"timeslice": {
"histogram": {
"script": "doc['timestamp'].date.getHourOfDay()",
"interval": 1,
"min_doc_count": 0,
"extended_bounds": {
"min": 0,
"max": 23
},
"order": {
"_key": "desc"
}
}
}
这很不错,因为它还包括零结果的任何小时,并且它会将结果扩展到整个24小时(由于extended_bounds)。
您可以使用'getDayOfWeek','getHourOfDay',...(有关详情,请参阅'Joda time')。
这个好几个小时,但是几天/几个月它会给你一个数字而不是月份名称。要解决此问题,您可以将时间段作为字符串 - 但,这将不适用于扩展边界方法,因此您可能有空结果(即[Mon,Tues,Fri,太阳])。
如果你想要的话,就在这里:
"aggregations": {
"dayOfWeek": {
"terms": {
"script": "doc['timestamp'].date.dayOfWeek().getAsText()",
"order": {
"_term": "asc"
}
}
}
即使这对您没有帮助,但希望其他人能够找到它并从中受益。
答案 2 :(得分:2)
最简单的方法是定义一个专用的星期几字段,该字段仅包含每个文档的星期几,然后在该字段上执行terms aggregation。
如果出于某种原因你不想这样做(或者不能这样做),这里有一个黑客可以帮助你得到你想要的东西。基本思想是定义一个"date.raw"
子字段,该字段是一个字符串,使用standard analyzer进行分析,以便为一周中的每一天创建术语。然后,您可以使用include来累计这些字词以获取您的计数,只包含您想要的字词。
以下是我用于测试的映射:
PUT /test_index
{
"settings": {
"number_of_shards": 1
},
"mappings": {
"doc": {
"properties": {
"msg": {
"type": "string"
},
"date": {
"type": "date",
"format": "E, dd MMM yyyy",
"fields": {
"raw": {
"type": "string"
}
}
}
}
}
}
}
以及一些示例文档:
POST /test_index/_bulk
{"index":{"_index":"test_index","_type":"doc","_id":1}}
{"msg": "hello","date": "Wed, 11 Mar 2015"}
{"index":{"_index":"test_index","_type":"doc","_id":2}}
{"msg": "hello","date": "Tue, 10 Mar 2015"}
{"index":{"_index":"test_index","_type":"doc","_id":3}}
{"msg": "hello","date": "Mon, 09 Mar 2015"}
{"index":{"_index":"test_index","_type":"doc","_id":4}}
{"msg": "hello","date": "Wed, 04 Mar 2015"}
以及汇总和结果:
POST /test_index/_search?search_type=count
{
"aggs":{
"docs_by_day":{
"terms":{
"field": "date.raw",
"include": "mon|tue|wed|thu|fri|sat|sun"
}
}
}
}
...
{
"took": 2,
"timed_out": false,
"_shards": {
"total": 1,
"successful": 1,
"failed": 0
},
"hits": {
"total": 4,
"max_score": 0,
"hits": []
},
"aggregations": {
"docs_by_day": {
"buckets": [
{
"key": "wed",
"doc_count": 2
},
{
"key": "mon",
"doc_count": 1
},
{
"key": "tue",
"doc_count": 1
}
]
}
}
}
以下是所有代码:
http://sense.qbox.io/gist/0292ddf8a97b2d96bd234b787c7863a4bffb14c5