使用TopHits聚合从存储桶中选择所有结果

时间:2015-04-29 07:33:55

标签: elasticsearch

我在条款聚合上使用TopHits聚合来获取记录,如下面的查询所示。

configurations.all {
    resolutionStrategy.force 'com.android.support:support-annotations:22.1.0'
}

我想获取存储桶中存在的所有记录而不是前200条记录,但随着大小值的增加,相同索引数据的查询时间也会增加(对于相同数量的记录)。

因此,我无法将大小值设置为随机大数,因为它会妨碍查询时间。

有没有办法有效地实现同样目标?

感谢。

1 个答案:

答案 0 :(得分:1)

在具有限制默认值的弹性搜索大小中,它会返回10个文档,但如果要增加文档,则size值会增加。

在这种情况下,我们检查this example

  

如果与from和size进行深度分页 - 例如?size = 10& from = 10000 - 非常低效,因为(在此示例中)必须从每个分片中检索100,000个排序结果并使用以便仅返回10个结果。必须对每个请求的页面重复此过程。

所以这种情况下你应该使用scroll api,因为

  

滚动API会跟踪已经返回的结果,因此能够比深度分页更有效地返回排序结果。但是,排序结果(默认情况下会发生)仍然有成本。

在您的情况下,您应该使用扫描和滚动如下:

 curl - s - XGET localhost: 9200 / logs / syslogs / _search ? scroll = 10 m & search_type = scan ' {
   "aggregations": {
     "group by": {
       "terms": {
         "field": "City"
       },
       "aggregations": {
         "top": {
           "top_hits": {
             "size": 200
           }
         }
       }
     }
   }
 }'

以上查询返回scroll id,然后传递滚动ID,如下所示

curl -XGET 'localhost:9200/_search/scroll?scroll=1m' -d 'scroll id '