定义
ES是建立在全文搜索引擎库Apache Lucene基础上的一个开源的搜索和分析引擎。
特点
ES它本身具有一个分布式存储,检索速度快的一个特性。所以我们经常会用它来全文检索这一类的场景。
比如说像网站搜索,公司内部用了ELK做日志聚集和检索,来去快速查找服务器的日志记录,去定位问题,基本上涉及到TB级别的数据场景。我用ES是一个比较好的选择。
ES之所以这么快的原因
原因一
ES是基于Lucene上开发的一个全文搜索引擎。一方面,Lucene是擅长管理大量的索引数据的,另外一方面他会对数据进行分词以后再保存索引。这样能够去提升数据的检索效率。
原因二
ES采用了倒排索引,所谓倒排索引就是通过属性值来确定数据记录的位置的索引,来去避免全表扫描这样一个问题。
原因三
ES中存储的数据采用了分片机制。
原因四
ES的扩展性很好。我们可以通过水平扩展的方式去增加服务器来提升ES的处理性能。
能够胜任上百台服务器节点的扩展,并且支持TB级别的结构化或者非结构化数据。
原因五
ES内部提供的数据汇总和索引生命周期管理的一些功能。可以方便我们更加高效地存储和搜索数据。
存在的问题
当然ES并不是万能的,如果使用不恰当的话,也会带来一些性能的瓶颈。
不建议使用复杂关联查询
比如说ES里面,我们不建议去使用复杂关联查询。这个对性能影响很大。
避免深度分页查询
第二个避免深度分页查询,因为ES的分页是支持from和size参数。在查询的时候,每个分片必须要要去先构造一个长度为from加size的优先队列。然后回传到网关节点。
网关节点再对这些优先队列进行排序,再找到正确的size文档。
而当from足够大的时候,容易造成OOM以及网络传输性能差的一些问题。