elasticsearch 索引优化

ES索引优化篇主要从两个方面解决问题,一是索引数据过程;二是检索过程。 
索引数据过程我在上面几篇文章中有提到怎么建立索引和导入数据,可是你们可能会遇到索引数据比较慢的过程。其实明白索引的原理就能够有针对性的进行优化。ES索引的过程到相对Lucene的索引过程多了分布式数据的扩展,而这ES主要是用tranlog进行各节点之间的数据平衡。因此从上我能够经过索引的settings进行第一优化: 
1
Java代码   收藏代码
  1. "index.translog.flush_threshold_ops""100000"  

2
Java代码   收藏代码
  1. "index.refresh_interval""-1"  

这两个参数第一是到tranlog数据达到多少条进行平衡,默认为5000,而这个过程相对而言是比较浪费时间和资源的。因此咱们能够将这个值调大一些仍是设为-1关闭,进而手动进行tranlog平衡。第二参数是刷新频率,默认为120s是指索引在生命周期内定时刷新,一但有数据进来能refresh像lucene里面commit,咱们知道当数据addDoucment会,还不能检索到要commit以后才能行数据的检索因此能够将其关闭,在最初索引完后手动refresh一之,而后将索引setting里面的index.refresh_interval参数按需求进行修改,从而能够提升索引过程效率。 
另外的知道ES索引过程当中若是有副本存在,数据也会立刻同步到副本中去。我我的建议在索引过程当中将副本数设为0,待索引完成后将副本数按需量改回来,这样也能够提升索引效率。 
“number_of_replicas”: 0 
上面聊了一次索引过程的优化以后,咱们再来聊一下检索速度比较慢的问题,其实检索速度快度与索引质量有很大的关系。而索引质量的好坏与不少因素有关。 

1、分片数 
分片数,与检索速度很是相关的的指标,若是分片数过少或过多都会致使检索比较慢。分片数过多会致使检索时打开比较多的文件别外也会致使多台服务器之间通信。而分片数过少为导至单个分片索引过大,因此检索速度慢。 
在肯定分片数以前须要进行单服务单索引单分片的测试。好比我以前在IBM-3650的机器上,建立一个索引,该索引只有一个分片,分别在不一样数据量的状况下进行检索速度测试。最后测出单个分片的内容为20G。 
因此索引分片数=数据总量/单分片数 
目前,咱们数据量为4亿多条,索引大小为近1.5T左右。由于是文档数据因此单数据都中8K之前。如今检索速度保证在100ms 如下。特别状况在500ms如下,作200,400,800,1000,1000+用户长时间并发测试时最坏在750ms如下. 

2、副本数 
副本数与索引的稳定性有比较大的关系,怎么说,若是ES在非正常挂了,常常会致使分片丢失,为了保证这些数据的完整性,能够经过副原本解决这个问题。建议在建完索引后在执行Optimize后,立刻将副本数调整过来。 
你们常常有一个误去副本越多,检索越快,这是不对的,副本对于检索速度其它是减无增的我曾作过实现,随副本数的增长检索速度会有微量的降低,因此你们在设置副本数时,须要找一个平衡值。另外设置副本后,你们有可能会出现两次相同检索,出现出现不一样值的状况,这里多是因为tranlog没有平衡、或是分片路由的问题,能够经过?preference=_primary 让检索在主片分上进行。 

3、分词 
其实分词对于索引的影响可大可小,看本身把握。你们越许认为词库的越多,分词效果越好,索引质量越好,其实否则。分词有不少算法,大部分基于词表进行分词。也就是说词表的大小决定索引大小。因此分词与索引膨涨率有直接连接。词表不该不少,而对文档相关特征性较强的便可。好比论文的数据进行建索引,分词的词表与论文的特征越类似,词表数量越小,在保证查全查准的状况下,索引的大小能够减小不少。索引大小减小了,那么检索速度也就提升了。 

4、索引段 
索引段即lucene中的segments概念,咱们知道ES索引过程当中会refresh和tranlog也就是说咱们在索引过程当中segments number不至一个。而segments number与检索是有直接联系的,segments number越多检索越慢,而将segments numbers 有可能的状况下保证为1这将能够提到将近一半的检索速度。 
Java代码   收藏代码
  1. $ curl -XPOST ‘http://localhost:9200/twitter/_optimize? max_num_segments =1′  


5、删除文档 
删除文档在Lucene中删除文档,数据不会立刻进行硬盘上除去,而进在lucene索引中产生一个.del的文件,而在检索过程当中这部分数据也会参与检索,lucene在检索过程会判断是否删除了,若是删除了在过滤掉。这样也会下降检索效率。因此能够执行清除删除文档。 
Java代码   收藏代码
  1. $ curl -XPOST ‘http://localhost:9200/twitter/_optimize? only_expunge_deletes =true’  
相关文章
相关标签/搜索