elasticsearch千亿数据查询速度非常慢

问题遇到的现象和发生背景

现象:使用elasticsearch java api RestHighLevelClient 客户端查询索引数据,耗时7~8分钟
业务使用场景:页面模糊搜索,要求对所有索引content、phone字段进行模糊查询或者对于phone精确查询
索引存储方式:按天存储,总共存储14个月的索引,比如:index_20221201
数据量级:目前3000亿,数据还在持续增加
数据录入方式:自己实现代码,使用scala开发,spark本地模式,实现读取本地gz文件解析内容写入es,一天录入数据量80亿左右
录入字段数量:12个字段
目前录入索引数量:216个,预计410个
查询做法:使用elasticsearch java api RestHighLevelClient 客户端查询索引数据
查询方式:包含terms、term、match、range、wildcard

操作环境、软件版本等信息

操作环境:

  1. 操作系统:centos7.9
  2. 硬件配置:五台物理机,56核心处理器,512GB内存,80T机械磁盘,1T*2 SSD磁盘安装操作系统,主备安装
    软件版本:
  3. jdk1.8
  4. elasticsearch版本:7.0.0
    部署方式:
    每台物理机部署11个实例,1个只作为客户端使用,既不是数据节点也不是master节点,1个既作为数据节点也作为master节点,9个作为数据节点
    JVM配置为:32GB
    尝试过的解决方法
  5. 增加实例,起初只有五个实例
  6. 调整配置参数:
{
  "persistent" : {
"indices.breaker.total.limit":"95%",
"indices.breaker.fielddata.limit":"40%",
"indices.breaker.request.limit":"70%"
  }
}
indices.fielddata.cache.size:30%

关闭swap
swapoff -a

我想要达到的结果

查询速度提升到秒级

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