如何检查最近3个月内连续2个月发生的事件?
How to check that the events happened during 2 consecutive months in last 3 months?
我想编写一个查询来检测特定人(由 PersonId
标识)是否在过去 3 个月的连续 2 个月内每月至少访问一个城市 1 次。
是否可以使用 Elasticsearch 查询语言?
我可以数出一个人每个月访问一个城市的次数。但是,我不知道如何计算连续2个月内最近3个月的访问量。
GET visits/_search?
{
"size":0,
"query": {
"bool": {
"must": [
{ "match": {
"PersonId": "AAA"
}}
]
} },
"aggs": {
"visit_days": {
"terms" : {
"field": "Month"
}
}
}
}
除了Month
(它是一个字符串),我还有Year
和Date
(这是日期类型)。
如果您可以在应用程序中处理日期直方图的解析逻辑,那可能是最好的方案。
下面是一个示例,说明您将如何至少获得该信息的存储桶:
GET visits/_search
{
"size": 0,
"query": {
"bool": {
"filter": {
"range": {
"visit_days": {
"gte": "now-3M"
}
}
}
}
},
"aggs": {
"histo": {
"date_histogram": {
"field": "visit_days",
"interval": "month"
}
}
}
}
以及示例输出:
{
"key_as_string": "2017-08-01T00:00:00.000Z",
"key": 1501545600000,
"doc_count": 1
},
{
"key_as_string": "2017-09-01T00:00:00.000Z",
"key": 1504224000000,
"doc_count": 0
},
{
"key_as_string": "2017-10-01T00:00:00.000Z",
"key": 1506816000000,
"doc_count": 1
}
然后为了满足您的要求,解析该响应并做一些简单的事情,比如检查倒数第二个月的计数是否为 0(假设 3 个月的限制是静态的)。
我想编写一个查询来检测特定人(由 PersonId
标识)是否在过去 3 个月的连续 2 个月内每月至少访问一个城市 1 次。
是否可以使用 Elasticsearch 查询语言?
我可以数出一个人每个月访问一个城市的次数。但是,我不知道如何计算连续2个月内最近3个月的访问量。
GET visits/_search?
{
"size":0,
"query": {
"bool": {
"must": [
{ "match": {
"PersonId": "AAA"
}}
]
} },
"aggs": {
"visit_days": {
"terms" : {
"field": "Month"
}
}
}
}
除了Month
(它是一个字符串),我还有Year
和Date
(这是日期类型)。
如果您可以在应用程序中处理日期直方图的解析逻辑,那可能是最好的方案。
下面是一个示例,说明您将如何至少获得该信息的存储桶:
GET visits/_search
{
"size": 0,
"query": {
"bool": {
"filter": {
"range": {
"visit_days": {
"gte": "now-3M"
}
}
}
}
},
"aggs": {
"histo": {
"date_histogram": {
"field": "visit_days",
"interval": "month"
}
}
}
}
以及示例输出:
{
"key_as_string": "2017-08-01T00:00:00.000Z",
"key": 1501545600000,
"doc_count": 1
},
{
"key_as_string": "2017-09-01T00:00:00.000Z",
"key": 1504224000000,
"doc_count": 0
},
{
"key_as_string": "2017-10-01T00:00:00.000Z",
"key": 1506816000000,
"doc_count": 1
}
然后为了满足您的要求,解析该响应并做一些简单的事情,比如检查倒数第二个月的计数是否为 0(假设 3 个月的限制是静态的)。