ElasticSearch知识点总结

1.分页知识点

       先举个场景,假如ES有10个分片,我们根据某个关键字查询数据,且按照时间排序,当查询第9页的数据,每页100条数据,当客户端发起这个操作,ES的处理流程是怎么样的?(带着问题去思考)

      1. from+size分页方式

      查询过程大体上分为查询和取回这两个阶段,广播查询请求到所有相关分片,并将它们的响应整合成全局排序后的结果集合,这个结果集合会返回给客户( 具体参考https://www.elastic.co/guide/en/elasticsearch/reference/6.4/search-request-from-size.html)

     查询阶段: 当一个节点接收到一个搜索请求,这这个节点就会变成协调节点,第一步就是将广播请求到搜索的每一个节点的分片拷贝,查询请求可以被某一个主分片或某一个副分片处理,协调节点将在之后的请求中轮训所有的分片拷贝来分摊负载。
每一个分片将会在本地构建一个优先级队列,如果客户端要求返回结果排序中从from 名开始的数量为size的结果集,每一个节点都会产生一个from+size大小的结果集,因此优先级队列的大小也就是from+size,分片仅仅是返回一个轻量级的结果给协调节点,包括结果级中的每一个文档的ID和进行排序所需要的信息。协调节点将会将所有的结果进行汇总,并进行全局排序,最总得到排序结果。

     取值阶段:查询过程得到的排序结果,标记处哪些文档是符合要求的,此时仍然需要获取这些文档返回给客户端
协调节点会确定实际需要的返回的文档,并向含有该文档的分片发送get请求,分片获取的文档返回给协调节点,协调节点将结果返回给客户端。

     重点回顾:我们想要查询的第9页符合条件的100条数据,可能分布到ES的10个分片里,那么ES需要到每个分片进行查询排序后把文档ID返回给协调节点(也就是每个节点把前1000条数据的文档ID返回给协调节点),协调节点聚合这1000*10条数据后在内存里进行排序,查到那100条数据再到各个分片获取文档的数据

     缺点:通过上面的流程我们看到当查询分页比较深的时候效率会有很大问题,还有一个无法解决的问题是,es 目前支持最大的 skip 值是 max_result_window ,默认为10000 。也就是当 from + size > max_result_window 时,es 将返回错误
 

      2. scroll分页方式

     流程:为了满足深度分页的场景,es 提供了 scroll 的方式进行分页读取(先从各个分片根据搜索结果获取文档ID排序后返回到协调节点,协调节点再进行排序,第一次和from+size流程一样,区别在于通过scroll会把这次搜索的文档ID都汇总到协调节点并缓存起来,下次根据分页获取的时候不再重新构造,而是直接从缓存里获取)具体就是原理上是对某次查询生成一个游标 scroll_id , 后续的查询只需要根据这个游标去取数据,直到结果集中返回的 hits 字段为空,就表示遍历结束。具体参考官网https://www.elastic.co/guide/en/elasticsearch/reference/6.4/search-request-scroll.html
     缺点:由于scroll_id 不仅会占用大量的资源(特别是排序的请求),而且是生成的历史快照,对于数据的变更不会反映到快照上。这种方式往往用于非实时处理大量数据的情况

     3.search_after 的方式

    用于在实时情况下如果处理深度分页,ES的版本>= 5.0 版本才提供的功能。

      4.具体使用方式

       todo

2. number?keyword知识点

       我们的项目中经常会有状态这种字段,比如订单状态,这个字段类型我们用number,还是keyword,我们应该怎么用? ES的5.0之前的版本表面上被定义为数值类型的字段,在暗地里都被转换成了字符串进行采用倒排索引,而在5.0之后Lucene6.0引入了重新设计的数值类型的索引结构,不再采用倒排索,而是使用了更适合范围查找的Block K-d Tree,如果状态的值比较少,个人建议用keyword(采用倒排索引),如果状态值比较多区分度比较高就用RangeQuery,如果字段类型设计成number的话,那就用RangeQuery,不建议使用Termquery(没有缓存,且性能差)
这两篇博客解释k-d tree对range查询的优化。以及k-d tree对term和filter查询性能低的影响https://www.elastic.co/cn/blog/searching-numb3rs-in-5.0
https://www.elastic.co/cn/blog/elasticsearch-query-execution-order
number?keyword https://elasticsearch.cn/article/446
ElasticSearch中的数据结构 https://blog.csdn.net/whichard/article/details/90753727

3 优秀文章

Elasticsearch 的亿级数据毫秒级查询优化思路 https://mp.weixin.qq.com/s/qxiczwP0vPHiIBBaKl-waQ

Elasticsearch 在各大互联网公司大量真实的应用案例!https://mp.weixin.qq.com/s/JQqex6kON6ixJUwodRZByA

 

你可能感兴趣的:(ES)