如何提高elasticsearch的查询速度?

王昆立


参与过搜索、数据分析等项目的开发者对于ElasticSearch较为熟悉,虽说ES目前应用广泛,但其实它的性能并非我们想像的那么好。

ElasticSearch的定位是什么?

ElasticSearch(简称ES)是用Java编程语言开发的基于Lucene的一款企业级搜索引擎服务器。它支持分布式部署,而且对外提供了RESTful API,便于各类编程语言调用。

ES性能并非想像中的那么好

ES数据量一大时,特别是第一次搜索的时候耗时会很久(甚至10s以上)。也不要认为改个参数就能改善所有性能慢的场景。

通过ES慢日志可分析查询效率

ES提供了慢日志,但默认是没有开启的。ES中的慢日志主要分两类:索引慢日志、搜索慢日志。如何开启呢?参考如下:

PUT /my_index/_settings

{

"index.search.slowlog.threshold.query.warn" : "10s\

网络圈


数据的增删改查一直都是互联网最基本的需求!而这些操作的90%都是查!!!

上世纪60年代,数据查询需求旺盛,关系型数据查询蓬勃发展,诞生了各种各样的数据库和SQL语言!数据库查询效率极高,建立索引也只能为字段的粒度!如果是想要对字段中的某些数据做查询,只能使用like语句,逐字匹配,查询效率不高!

这时候全文搜索就能体现出更为强大的效率!

全文搜索是对所有的数据进行拆分,对每一个词都分别建立索引,记录词语所在的位置和出现的次数,然后在查询的时候能快速找到文档所在处,实现快速查询!

比如1,我是一个兵!2,我爱你!两句话会分别拆分之后保存到一个索引文档中进行维护,比如说我字就会保存有两次的频率,并且在两句话中都有出现,在搜索"我"字的时候,就能把两句话搜索出来!

比如下图:

不管是淘宝,百度网页等都是通过对链接或者标题等进行索引保存,在关键字搜索的时候就能选择出关键词所在的标题,根据相关度进行排序,最后查询出所有需要的标题进行显示!

而全文搜索的实现都很多,包括底层的lucence,企业级应用solr,elasticsearch等等!elasticsearch因为其天然的分布特性,和便于大量水平扩展的特性,restful的服务接口收到广泛关注和使用!



了解全文搜索基本原理以后,本文不对elasticsearch的原理,集群使用,索引分片,传输协议展开来讲,而且因为elasticsearch是开源的,可以通过简单的配置就能方便使用,而不用关注其内部实现,回到问题所在,怎么才能更快的搜索?

1,服务器内存要大一点,因为索引加载需要大量内存,并且最大最小内存设置相同值,防止GC时候的大量stop the world!

2,设置合理的索引刷新时间,indwx.fresh_interval如果设置过大,索引查不到容易导致异常,设置太小,服务器压力会很大!

3,禁用_all,打开会导致拷贝增加,查询效率变低!

4,防止设置过多的分片副本,增大合并时间,影响查询效率!

5,优化查询返回字段,减少内存占用!

6,添加查询缓存!

elasticsearch是一门分布式搜索技术,涉及到的知识点很多,没办法简单介绍,找时间会详细的讨论并奉上Demo,需要的同学,敬请关注。。。


分享到:


相關文章: