Elasricsearch搜索速度优化
1.合理设置副本数量
增加副本,可以提升搜索的能力。
如果副本设置过多,会对服务器造成额外的压力,因为主分片需要给所有副本同步数据。另外,副本过多也会占用磁盘空间。一般建议最多设置2-3个即可。
2.设置分片数量
如果分片数过少或过多,都会导致检索比较慢。分片数过多会导致检索时打开比较多的文件,另外也会导致多台服务器之间通讯。而分片数过少会导至单个分片索引过大,所以检索速度也会慢。
建议单个分片最多存储20G左右的索引数据,所以,分片数量=数据总量/20G
2.设置memory_lock来锁定进程的物理内存地址
避免内存交换(swapped)来提高性能
修改文件conf/elasticsearch.yml
bootstrap.memory_lock: true
3.修改配置文件调整ES的JVM内存大小
修改bin/elasticsearch.in.sh中ES_MIN_MEM和ES_MAX_MEM的大小,建议设置一样大,避免频繁的分配内存,根据服务器内存大小,一般分配60%左右(默认256M)
注意:内存最大不要超过32G【详情请看如下的截图和文字说明】
一旦你越过这个神奇的32 GB边界,指针会切换回普通对象指针.。每个指针的大小增加,使用更多的CPU内存带宽。事实上,你使用40~50G的内存和使用32G的内存效果是一样的。
4.针对不使用的index,建议close,减少内存占用
因为只要索引处于open状态,索引库中的segement就会占用内存,close之后就只会占用磁盘空间了。
curl -XPOST 'localhost:9200/index/_close'
5.删除文档时要注意清除文档
在es中删除文档,数据不会马上在硬盘上除去,而是在es索引中产生一个.del的文件,而在检索过程中这部分数据也会参与检索,es在检索过程会判断是否删除了,如果删除了在过滤掉。这样也会降低检索效率。
所以可以执行清除删除文档:
curl -XPOST 'http://ip:9200/index/_forcemerge?only_expunge_deletes=true'
client.admin().indices().prepareForceMerge("zhouls").setOnlyExpungeDeletes(true).get();
6.把log输出水平改为info
log输出的水平默认为trace,即查询超过500ms即为慢查询,就要打印日志,造成cpu和mem,io负载很高。把log输出水平改为info,可以减轻服务器的压力。
修改ES_HOME/conf/logging.yaml文件
7.段合并
为不再更新的只读索引,执行段合并操作,合并成单个分段。
8.导入停止词
注意每个节点都需要导入一次,导入后重启es。
9.文档模型
文档应合理建模,避免join操作,嵌套查询。
10.使用二级索引
现在的大数据量的全文检索,基本使用es+hbase进行二级索引,es保存hbase中的rowkey,极大减少了es数据量大小。
11.按照可用的维度,例如时间来分索引,每个月一个索引,通过别名的方式关联各个索引。
…持续更新中