我正在使用elasticsearch在我的event-portal上为我的首页收集数据。当前查询如下:
{
"query": {
"function_score": {
"filter": {
"and": [
{
"geo_distance": {
"distance": "50km",
"location": {
"lat": 50.78,
"lon": 6.08
},
"_cache": true
}
},
{
"or": [
{
"and": [
{
"term": {
"type": "event"
}
},
{
"range": {
"datetime": {
"gt": "now"
}
}
}
]
},
{
"not": {
"term": {
"type": "event"
}
}
}
]
}
]
},
"functions": [
...
]
}
}
}
所以基本上50公里距离内的所有事件都是未来事件或其他类型。其他类型可以是状态,照片,视频,声音云等......所有这些项目都有一个日期时间字段和一个父项字段,用于记录项目所属的项目。过滤器后面有一些函数可以根据距离和年龄对对象进行评分。
现在我的问题: 有没有办法过滤查询以获得每个帐户每天每个类型的第一个(甚至更好的最高得分)5个项目?
所以目前我的帐户同时上传了20张图片。这在首页上显示的太多了。
我考虑过在post_filter中使用过滤器脚本。但我对这个话题并不是很熟悉。
有什么想法吗?
非常感谢提前
DTFagus
答案 0 :(得分:2)
我这样解决了:
"aggs": {
"byParent": {
"terms": {
"field": "parent_id"
},
"aggs": {
"byType": {
"terms": {
"field": "type"
},
"aggs": {
"perDay": {
"date_histogram" : {
"field" : "datetime",
"interval": "day"
},
"aggs": {
"topHits": {
"top_hits": {
"size": 5,
"_source": {
"include": ["path"]
}
}
}
}
}
}
}
}
}
}
不幸的是,聚合没有分页(或其他方式:不使用查询的分页)。所以我将得到分页查询结果和所有命中的聚合,并在js中交叉数组。听起来不是很有效但我目前没有更好的主意。任何人?
我看到的唯一方法是将所有数据索引为两个索引。一个包含所有数据,一个每个帐户每个类型只有前5个。这可以减少查询的时间,但在编制索引时会花费更多时间和存储空间:/
答案 1 :(得分:0)
您可以使用“size”参数限制查询返回的结果数。如果将size设置为5,那么您将获得查询返回的前5个结果。 查看文档http://www.elasticsearch.org/guide/en/elasticsearch/guide/current/pagination.html
希望这有帮助!