术语聚合中的限制和偏移ElasticSearch

时间:2015-04-02 12:11:07

标签: elasticsearch elasticsearch-aggregation

有办法获得前n个术语的结果。例如:



{
  "aggs": {
    "apiSalesRepUser": {
      "terms": {
        "field": "userName",
        "size": 5
      }
    }
  }
}




有没有办法设置条款结果的偏移量?

3 个答案:

答案 0 :(得分:2)

如果你的意思是忽略第一个m结果并返回下一个n结果,那么就没有;这不可能。解决方法是将size设置为m + n并执行客户端处理以忽略第一个m结果。

答案 1 :(得分:1)

稍晚一些,但是(至少)自Elastic 5.2.0起,您可以在术语聚合中使用分区来对结果进行分页。

https://www.elastic.co/guide/en/elasticsearch/reference/5.2/search-aggregations-bucket-terms-aggregation.html#_filtering_values_with_partitions

答案 2 :(得分:0)

也许这会有所帮助:

"aggregations": {
    "apiSalesRepUser": {
      "terms": {
        "field": "userName",
        "size": 9999 ---> add here a bigger size 
      }
    },
  "aggregations": {
    "limitBucket": {
      "bucket_sort": {
        "sort": [],
        "from": 10,
        "size": 20,
        "gap_policy": "SKIP"
      }
    }
  }
}

我不确定该术语的大小是多少。我建议给一个合理的值。这限制了初始聚合,然后第二个limitBucket agg将再次限制术语agg。这可能仍会将您在术语agg中限制的所有文档加载到内存中。这就是为什么它取决于您的方案的原因,如果合理,则无法获得所有结果(即,如果您有成千上万个)。也就是说,您正在执行类似Google的搜索,而无需跳至第1000页。

与在客户端获取数据的替代方法相比,这可以为您节省一些从ES进行数据传输的费用,但是正如我所说的那样,在将所有大量数据加载到ES内存中时请仔细权衡一下,您可能会遇到内存问题在ElasticSearch中