我想编写一个查询,可以检测特定人(由PersonId
标识)是否在过去3个月内连续两个月每月至少访问一个城市。
是否可以使用Elasticsearch查询语言?
我可以计算一个人每个月访问一个城市的次数。但是,我不知道如何计算连续两个月内过去3个月的访问次数。
GET visits/_search?
{
"size":0,
"query": {
"bool": {
"must": [
{ "match": {
"PersonId": "AAA"
}}
]
} },
"aggs": {
"visit_days": {
"terms" : {
"field": "Month"
}
}
}
}
除了Month
(它是一个字符串),我还有Year
和Date
(这是日期类型)。
答案 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个月的限制是静态的)。