2017-10-12 84 views
0

我想写一个查询,可以检测特定人员(由PersonId标识)是否在过去3个月内连续2个月每月至少访问过一次城市。如何查看过去3个月连续两个月发生的事件?

可以使用Elasticsearch查询语言吗?

我可以统计一个人每个月访问一个城市的次数。但是,我不知道如何计算在过去3个月内连续两个月的访问。

GET visits/_search? 
{ 
"size":0, 
"query": { 
    "bool": { 
     "must": [ 
     { "match": { 
      "PersonId": "AAA" 
     }} 
     ] 
    } }, 
    "aggs": { 
    "visit_days": { 
    "terms" : { 
     "field": "Month" 
    } 
    } 
    } 
} 

除了Month(它是一个字符串),我也有YearDate(这是最新型)。

回答

0

如果您可以处理应用程序中日期直方图的解析逻辑,那可能是最佳方案。

这里是你如何就至少得拿到水桶该信息的示例:

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个月的限制是静态的)。