使用弹性搜索在确定的时间段内按投票过滤
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" } }
}
}
}
我有用户的投票索引如下
{
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" } }
}
}
}