我在条款聚合上使用TopHits聚合来获取记录,如下面的查询所示。
configurations.all {
resolutionStrategy.force 'com.android.support:support-annotations:22.1.0'
}
我想获取存储桶中存在的所有记录而不是前200条记录,但随着大小值的增加,相同索引数据的查询时间也会增加(对于相同数量的记录)。
因此,我无法将大小值设置为随机大数,因为它会妨碍查询时间。
有没有办法有效地实现同样目标?
感谢。
答案 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 '