我在Elasticsearch中有一个用户帖子的索引。我想从这个索引中检索user_id,如果在给定的日期范围内,至少有X个帖子。否则跳过这样的帖子。
无论如何,我可以在ES中实现它,或者我必须得到所有实体并在以后处理它们?
Trawa;)
答案 0 :(得分:0)
要回答您的问题,我们会假设您的地图中包含user
和datetime
字段。
您可以像这样获取所请求的数据:
获取在给定日期范围内拥有超过X(即X = 100)帖子的用户列表 - 按特定日期范围的用户名汇总:
{
"size": 0,
"query": {
"bool": {
"must": [
{
"range": {
"datetime": {
"gte": "2017-05-01",
"lt": "2017-06-01"
}
}
}
]
}
},
"aggregations": {
"users": {
"terms": {
"field": "user",
"min_doc_count": 100
}
}
}
}
修改查询以使您的日期范围(及其格式)和min_doc_count
与每位用户的最低X帖子相匹配。
修改强>:
无法避免terms_aggregation
获取所有不同的值。
50k值似乎确实需要检索大量数据 - 但它还取决于您的群集。
我的建议是添加另一个过滤器,比方说,按字母顺序过滤,而不是在其他几个查询中一次性获得50k结果:
"must": [
{
"range": {
"datetime": {
"gte": "2017-05-01",
"lt": "2017-06-01"
}
}
},
{
"wildcard": {
"user": "a*"
}
},
{
"wildcard": {
"user": "b*"
}
}
]
请参阅Wildcard
不幸的是,滚动聚合结果不可用。手动将数据分成碎片是我现在能看到的最好的东西。