Elasticsearch:将过滤后的查询限制为每个类型每天5个项目

时间:2014-11-26 08:15:53

标签: elasticsearch

我正在使用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

2 个答案:

答案 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

希望这有帮助!