当前位置: 首页 > 后端技术 > Java

ElasticSearch集群查询执行原理

时间:2023-04-01 21:35:25 Java

1、执行原理如下:例如查询offset=500,limit=20的数据。由于ElasticSearch中的数据存储在各个分片中,按照一般的查询流程,如果要查询前10条数据必须经过以下过程:1.客户端向分片的主节点发送请求簇。2、主节点将请求转发给各个分片,查询每个分片上的前500+20=520条数据。3.每个分片返回结果给主节点,整合数据,提取第500到520项。4.将数据返回给请求的客户端。这样会带来的问题是当分页很深的时候,比如取5000到5010条数据的时候,elasticsearch需要在每5010条数据从shard中取出,然后聚合到master节点,主节点对所有结果进行排序,选出前10个结果返回给客户端,其他数据全部丢弃。所以,当分页很深的时候,特别容易造成集群OOM,即使不OOM,也会消耗CPU和内存资源。所以ES使用index.max_result_window:10000配置作为保护措施,即默认的from+size不能超过10000。虽然这个参数可以动态修改或者在配置文件中配置,但是最好不要这样做,因为它消耗了太多的集群资源和性能。2.滚动“深”分页好在ElasticSearch也提供了滚动“深”分页的方法,可以支持我们在es集群上进行深翻页,甚至读取所有数据。执行原理如下:scroll可以理解为关系型数据库中的一个游标,scroll具体分为初始化和遍历两步:1.初始化时,缓存所有满足搜索条件的搜索结果,可以被想象成一个快照并返回一个_scroll_id2。遍历时,使用_scroll_id从这个快照中获取数据。3、每次取数据后,返回一个新的_scroll_id,记录当前阅读位置,下次可以根据这个新的_scroll_id继续阅读以下内容4、如果没有数据,返回空命中,这样就可以判断是否遍历了所有的数据