类似于mysql中select ……limit n,m,限制返回的结果集条数并分页显示,需要用到elastic search中的分页参数。es提供了三种api方式进行分页:
- from size
- scroll
- search_after
from/size进行分页
from/size进行时分页是es中最常用的分页方案,from表示开始位置偏移量(从0开始),size表示条数大小,和mysql的 limit n,m 意思是一致的,也可以在es查询中使用分页,默认from和size分别是0、10:
from/size的鸡肋在于深度分页的时候,from+size值不能大于index.max_result_window参数(默认10000),否则会直接返回错误。
在数据分片存储的情况下,页数越深,处理的文档就越多,占用的堆内存也就越大,耗时越长,效率越低,因此es有max_result_window参数来限制深度分析。例如你需要"from":"8990","size":"10",在数据分片存储的情况下,你需要在每个分片节点上都获取8990+10=9000条数据,然后再聚合各个分片上的9000条结果取前10条数据再返回,所以效率肯定是个问题,因此es推出了另一个种分页方式: scroll。
scroll
scroll通过生成快照的方式避免深度分页问题,它需要先发起一个scroll search请求,并指明有效期时间和size,然后拿到这个返回的id后,再进行迭代hits.hits即可:
scroll由于数据不是实时性的,所以不能用来做实时搜索,同时官方也建议尽量不要使用复杂的sort条件,使用_doc最高效。
search_after
由于scroll不适用于实时搜索,因此可以用search_after来替代。search_after上一页的最后一条数据来获取下一页的,所以只能进行"下一页"翻页,而不能上一页,也不能进行自由翻页,且为了定位上一页的最后一条数据,需要保证每个文档值的唯一,比如文档的"_id"字段,search_after可以做实时搜索。第一步:进行正常的搜索,但是要指定sort值,且值要唯一:
第二步:使用第一步获取到的sort值进行search_after:
上一篇: Elastic Search之Source Filtering(过滤结果中"_source"原始文本显示哪些字段)
下一篇: Elastic Search之Java API(文档操作API、Query DSL查询API)
scroll官方说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-scroll.html
search_after官方说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-search-after.html
from/size官方说明:https://www.elastic.co/guide/en/elasticsearch/reference/current/search-request-from-size.html