如何检查过去3个月内连续2个月发生的事件?

时间:2017-10-12 19:40:00

标签: elasticsearch lucene elasticsearch-5

我想编写一个查询,可以检测特定人(由PersonId标识)是否在过去3个月内连续两个月每月至少访问一个城市。

是否可以使用Elasticsearch查询语言?

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

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

除了Month(它是一个字符串),我还有YearDate(这是日期类型)。

1 个答案:

答案 0 :(得分: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个月的限制是静态的)。