Elastic Search优化

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Elastic Search优化相关的知识,希望对你有一定的参考价值。

参考技术A 设置系统的最大打开文件数,可以调大到32k以上,且集群每个节点都要操作;

修改Elastic Search的JVM的内存大小;

锁定物理地址,避免内存交换,提高性能;

分片过多会导致打开的文件比较多,增加节点之间的通讯代价,影响性能;分片数太少会导致单个分片索引过大,检索速度变慢,一般10个左右比较合适,不易超过30个,每个分片数据应该在20G左右,即分片数 = 数据总量 / 20G;

副本增加可以提高检索能力,但是也增加了副本同步数据的压力,增加磁盘空间,一般设置2-3个副本集合;

Segment越多,占用的segment memory就会越多,性能反而降低。索引量不大时,可以设置Segment为1,另外可以调整segment merge的配置参数来提高性能,如max_thread_count和单个segment的最大容量等;

因为只删除type不会释放空间。

索引处于open状态,索引库的Segment就会占用过内存空间,close后会释放内存空间,不释放磁盘空间;

删除后的数据记录不是立刻清除磁盘数据,而是导入到了.del文件中,这部分数据仍然参与检索,在检索过程中再判断是否删除,然后再过滤。因此清除已经删除的数据记录会提高检索效率;

等到数据导入完成后,再恢复副本数量,避免了导入数据时,又要同步副本的性能压力;

Index默认会有一个_all字段,默认把所有字段的数据copy到_all字段里,方便了query,却增加了索引时间和索引大小;

Elastic Search的默认log级别是trace,当慢查询操作500ms时,就会打印日志,造成了集群负载,影响性能。可以将log级别调整为info;

Elastic Search默认检索只会返回ID,然后根据这个ID去倒排索引你中取每个field数据,当开启时,Elastic Search可以根据ID直接检索对应source JSON的field,不再需要倒排索引;

默认情况下,index刷新间隔为1秒,即数据写入1秒后就可以被query到,每次刷新都会产生新的Lucene段,进而导致频繁的Segment merge行为。

针对中文查询搜索,一定要安装ik分词,有ik_max_word和ik_smart,极大的提高的查询性能和准确度,否则就会逐个中文字进行匹配,耗费性能。
在插入文档时,ES查看该字段有没有定义analyzer,如果定义了就用定义的,否则使用ES默认的;
在搜索文档时,ES会先去看字段有没有定义search_analyzer,如果没有定义,就去看有没有analyzer,再没有定义就使用否则使用ES默认的。
针对中文分词,一般创建index时指定analyzer = ik_max_word,search_analyzer = ik_smark。

根据业务增量需求,可以基于日期模板来创建索引,然后通过roll over API滚动索引。

采取冷热分离机制,热数据存储到SSD,提高检索效率;冷数据定期进行shrink操作,以缩减存储;

采取curator进行索引的生命周期管理。

写入前关闭refresh_interval设置为-1,禁用刷新机制。

Elastic Search为避免深分页带来的性能问题(可参考: https://www.jianshu.com/p/f25c19d73b8f ),Elastic Search禁止查询10000条以后的数据(可配置)。Elastic Search提供了scroll游标来解决深分页问题,即初始化查询时将所有符合条件的搜索结果缓存起来,然后遍历缓存里面的数据。避免每次搜索都必须重新排序的问题,但是初始化之后,对索引的数据更改不会同步到缓存中,即不对游标遍历结果有影响。

针对term index,仅仅使用数据的一部分前缀与term dictionary的block之间的映射关系,再结合FST(Finite State Transducers)的压缩技术,可以使term index缓存到内存中;
针对ID使用Frame Of Reference压缩;

以上是关于Elastic Search优化的主要内容,如果未能解决你的问题,请参考以下文章

如何使用现有索引创建 Elastic App Search Engine(来自 GraphDB Elastic Search Connector 的数据)

Golang 用Olivere库操作Elastic Search

elastic search interval

开启elastic search 脚本

Observability:使用 Elastic APM 监控 Elastic Enterprise Search 性能

Observability:使用 Elastic APM 监控 Elastic Enterprise Search 性能