使用弹性搜索在确定的时间段内按投票过滤

Filter by votes in a determined period with elasticsearch

我有用户的投票索引如下

{
 id: 1
 name: John
 votes: [
   {
    id: 1
    created_at: 2015-01-01T15:50:59.000+02:00
   },
   {
    id: 2
    created_at: 2015-02-15T18:42:30.000+02:00
   },
   {
    id: 3
    created_at: 2015-02-22T02:06:15.000+02:00
   }
 ]
},
{
 id: 2
 name: Mark
 votes: [
   {
    id: 1
    created_at: 2015-02-10T08:18:20.000+02:00
   }
 ]
}

并且我想在确定的时间段内根据投票数过滤用户,例如对于上个月被投票两次的用户,我将只得到 John。

我知道如何让上个月的用户投票

{  
   "filter":{  
      "bool":{  
         "must":[  
            {  
               "range":{  
                  "user.votes.created_at":{  
                     "from":"now-1M"
                  }
               }
            }
         ]
      }
   }
}

但我不知道如何汇总每个文档的投票并根据它进行过滤。或者我可以使用其他机制。

提前致谢

如果您想通过 GROUP BY ... HAVING ... in SQL 之类的聚合结果过滤结果,那么(据我所知)Elasticsearch 无法帮助您...然而。您将不得不在应用程序端执行该逻辑。参见 Issue #4404 on Elasticsearch GitHub

但是汇总每个用户的投票数的查询可能如下所示:

{
    "query":{
        "filtered":{
            "filter":{  
                "bool":{  
                    "must":[  
                        { "range":{  "user.votes.created_at":{ "from":"now-1M" } } }
                    ]
                }
            }
        }
    },
    "aggs" : {
        //A bucket for each user ID
        "users": { "terms"  : { "field" : "user.id" } },
        //Aggregate the number votes for each user
        "aggs" : { 
            "num_votes" : { "value_count" : { "field" : "user.votes.created_at" } }
        }
    }
}