ElasticSearch 性能优化

在这里插入图片描述

提升写入性能

使用 bulk 接口批量写入

  1. 节省重复创建连接的网络开销
  2. 通过进行基准测试来找到最佳的批处理数量

延长 refresh 的时间间隔

  1. 通过延长 refresh(刷新)的时间间隔可以降低段合并的频率,段合并十分耗费资源
  2. 默认的刷新频率为1s,对 index 修改 index.refresh_interval 即可立即生效

初始化性能的大量写入

  1. 比如 reindex 或是导入基础数据这种一次性批量索引操作
  2. 可以配置成不刷新,并且把副本数也配置成0,完了之后再设置成正常值

关闭操作系统的 swapping

  1. 操作系统会自动把不常用的内存交换到磁盘(虚拟内存),关闭后就不会进行交换

使用自动生成的id

  1. 指明文档 id 时,es 需要先判断一下这个 id 对应的文档是否已经存在,以做一些合并或者更新操作。如果使用自生成的 id,可以跳过这个步骤,加快索引速度

合理设置字段 mapping

  1. 不需要分析的字段就不用分析

合理设置分片和副本数量

  1. 副本数量越多,写入越慢

提升查询性能

用过滤器上下文替代查询上下文

  1. 过滤器上下文,不计算得分可以减少资源消耗,过滤器结果可以缓存

避免使用脚本

  1. 脚本非常耗性能,因为每次计算且无法缓存
  2. 如果非用不可,就用 painless 或者 expressions

提前索引字段

假如有如下的文档

PUT index/_doc/1
{
  "designation": "spoon",
  "price": 13
}

经常进行如下的范围查询

GET index/_search
{
  "aggs": {
    "price_ranges": {
      "range": {
        "field": "price",
        "ranges": [
          { "to": 10 },
          { "from": 10, "to": 100 },
          { "from": 100 }
        ]
      }
    }
  }
}

索引的时候可以增加一个 price_range 字段,用来存储范围

PUT index
{
  "mappings": {
    "properties": {
      "price_range": {
        "type": "keyword"
      }
    }
  }
}

PUT index/_doc/1
{
  "designation": "spoon",
  "price": 13,
  "price_range": "10-100"
}

最开始的分组方式就可以改成如下形式

GET index/_search
{
  "aggs": {
    "price_ranges": {
      "terms": {
        "field": "price_range"
      }
    }
  }
}

合理 mapping

  1. 数值数据可以映射为 numeric 类型或者keyword类型
  2. 数字类型适合范围查询
  3. keyword 类型适合精确查询(精确查询时搜索 keywrod 比搜索 numeric 更快)

比如产品id或者 ISBN(一种用于唯一标识图书的国际标准)基本上是用在精确查询的场景中,我们就可以映射为 keyword 类型

使用更轻量的查询语句

  1. 通配符查询很费性能,尤其是通配符放在前面

不要使用关联关系

  1. 不管是嵌套还是父子,都会使查询量倍增

增加副本数量

  1. 查询时会查询主分片或副本分片,因此增加副本数量可以提高系统吞吐量

按时间查询时对时间进行四舍五入

  1. 这样可以更好的利用缓存

在可以接受的前提下,可以从方式一改为方式二

方式一:查询当前时间减去1小时到当前时间,精确到秒的时间范围

GET index/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "my_date": {
            "gte": "now-1h",
            "lte": "now"
          }
        }
      }
    }
  }
}

方式二:和方式一相比,多了/m,表示这是一个精确到分钟的相对时间范围

GET index/_search
{
  "query": {
    "constant_score": {
      "filter": {
        "range": {
          "my_date": {
            "gte": "now-1h/m",
            "lte": "now/m"
          }
        }
      }
    }
  }
}

如果 index 不再写入可以合并分段

  1. 分段越少,查询越快,每次查询都要拆到所有分段去处理,再合并结果,有 _forcemerge 接口,可以把分段数设为1
  2. 甚至可以合并分片,reindex 或 shink
POST /my-index-000001/_forcemerge

给文件系统(filesystem cache)预留足够内存

  1. es 非常依赖操作系统的文件缓存来提高查询速度
  2. 预留至少一半的内存给文件系统缓存

使用 ssd 磁盘而且别用远程磁盘

  1. es需要频繁读取磁盘

路由优化

节省磁盘空间

关闭不需要的特性

  1. 不被用来查询的字段,不索引
  2. 不做全文检索,不分词
  3. 不关注文档相关性,关闭 norms
  4. 不需要短语搜索,关闭位置索引

不要使用自动 mapping

  1. 默认会对 string 字段做两次索引(text 和 keyword)

禁用 _source 字段

  1. _source字段存储了文档原始的 json 格式,如果不需要访问,可以禁用

配置压缩存储

分段合并

  1. 段里面的数据是逻辑删除的,段合并的时候会将这些数据真正删除

数字类型用最小数字类型

  1. 尽量选择占用空间较小的数组类型,byte < short < integer < long

参考博客

官网性能优化建议
[1]https://www.elastic.co/guide/en/elasticsearch/reference/8.11/how-to.html
[2]https://pdai.tech/md/db/nosql-es/elasticsearch-y-peformance.html

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:/a/301124.html

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

论文阅读记录SuMa SuMa++

首先是关于SuMa的阅读&#xff0c;SuMa是一个完整的激光SLAM框架&#xff0c;核心在于“基于面元(surfel)”的过程&#xff0c;利用3d点云转换出来的深度图和法向量图来作为输入进行SLAM的过程&#xff0c;此外还改进了后端回环检测的过程&#xff0c;利用提出的面元的概念和使…

LeetCode-加一(66)

题目描述&#xff1a; 给定一个由整数组成的非空数组所表示的非负整数&#xff0c;在该数的基础上加一。 最高位数字存放在数组的首位&#xff0c; 数组中每个元素只存储单个数字。 你可以假设除了整数 0 之外&#xff0c;这个整数不会以零开头。 思路&#xff1a; 这里主要分…

java 生成一个当前时间的时间搓

开发过程中 用时间搓数值格式存储 会更加精准 那么 我们在一些日常增删查改中就可以用时间搓来记录操作时间 就一行代码 long timestamp System.currentTimeMillis();他就能生成当前时间的时间搓 运行结果如下 然后 我们可以在 http://shijianchuo.wiicha.com/ 上进行转换查…

自动驾驶apollo9.0 Dreamview Debug方法

Apollo 9.0 安装&编译方法 # 拉取源码 git clone gitgithub.com:ApolloAuto/apollo.git git checkout v9.0.0# 启动docker bash docker/scripts/dev_start.sh bash docker/scripts/dev_into.sh# 编译project ./apollo.sh build默认启动方式 default mode wget https:…

QT:单例

单例的定义 官方定义&#xff1a;单例是指确保一个类在任何情况下都绝对只有一个实例&#xff0c;并提供一个全局访问点。 单例的写法 抓住3点&#xff1a; 构造函数私有化&#xff08;确保只有一个实例&#xff09;提供一个可以获取构造实例的接口&#xff08;提供唯一的实…

Nginx 搭建可道云网盘

目录 1.安装php-fpm 2. 建站点根目录与配置 2.1 建站点根目录 2.2 配置 3. 搭建成功 1.安装php-fpm nginx 需要使用php 需要安装php-fpm yum install php-fpm php-mbstring php-mysqlnd php-gd -y 修改 www.conf 文件的配置29行和41行&#xff0c;将用户会让用户组改成n…

Python笔记07-异常、模块和包

文章目录 异常及捕获方法python模块python包安装第三方包 异常及捕获方法 当检测到一个错误时&#xff0c;Python解释器就无法继续执行了&#xff0c;反而出现了一些错误的提示&#xff0c;这就是所谓的“异常”, 也就是我们常说的BUG 例如&#xff1a;以r方式打开一个不存在的…

NI基于PC的测量和控制系统

基于PC的测量和控制系统为工程师提供了电气和物理测量功能&#xff0c;使其能够以可自定义、准确且经济实惠的方式进行台式测量. 什么是基于PC的测量和控制系统&#xff1f; 在基于PC的测量和控制系统中&#xff0c;NI硬件产品通过USB或以太网连接到PC或笔记本电脑。这种系统具…

mysql高可用方案之MHA

mysql集群高可用方案&#xff1a; 单主&#xff1a;keepalived、MHA、MMM 多主&#xff1a;MySQL cluster 、PXC MHA的工作原理 MHA node 运行在每台MySQL服务器上&#xff0c;MHA Manager会定时探测集群中的master节点&#xff0c;当master出现故障时&#xff0c;它可以自…

C语言.不同数据类型之间相互赋值_强制类型转换_非强制类型转换

不同数据类型之间相互赋值 这个问题是 C/c的&#xff0c;Java 等其他语言会报错&#xff0c;这里不会报错 当 int i2147483647;时&#xff0c;可以正常输出。 当 int i2147483648;时会变成-2147483648。 在大多数现代计算机系统中&#xff0c;整数通常采用补码表示法。这意味着…

【Emgu.CV教程】2.13、基本方法之MinMaxLoc()最大值最小值查找

我们可以简单的把图像看成是一个矩阵&#xff0c;图像算法就转换成对这个矩阵的各种操作&#xff0c;比如加减乘除、矩阵转置、归一化等等&#xff0c;这样对以后的函数理解会更直观。 在图像分割、颜色处理过程中&#xff0c;经常需要统计出图像内的最大值、最小值&#xff0c…

详解Java中@Accessors注解(全)

目录 前言1. 概念2. 属性2.1 fluent属性2.2 chain属性2.3 prefix属性 前言 关于该注解的学习&#xff0c;主要来源项目中涉及&#xff0c;对此进行查漏补缺 Accessors 注解通常用于简化实体类的代码&#xff0c;使其更加简洁和易读。 1. 概念 Accessors 是 Lombok&#xff…

快手面经总结(2024最新)

快手 面经1-一面 开始先是手撕算法两道 自我介绍两道手撕 将字符串转化为整数 (这里当时出现溢出值问题&#xff0c;进行了思考解决&#xff0c;写了两种方式)synchronize &#xff0c; 可以使用的几种形式&#xff0c;代码写出 操作系统 和 数据结构 hash解决冲突 &#xff…

【认知计算】《智能追踪》

故事背景科技相关&#xff1a; 认知计算 意在使计算机系统能够像人的大脑一样学习、思考&#xff0c;并做出正确的决策。 模仿大脑从经验中学习&#xff0c;发现不同事物之间的联系&#xff0c;进而实现逻辑推理和记忆等功能。 认知计算是一种类脑计算模式&#xff0c;源自模…

我的创作纪念日——redis的历史纪录

机缘 最开始只想存留点Redis的操作信息&#xff0c;后来写着写着也就写多了&#xff0c;虽然后面很长时间由于忙就没继续写&#xff0c;但是还是偶尔登录看一下&#xff0c;有好几篇文章的浏览量还是很多的呢。 收获 收获不多&#xff0c;粉丝也才三十多个&#xff0c;浏览量感…

html 原生网页使用ElementPlus 日期控件el-date-picker换成中文

项目&#xff1a; 原生的html,加jQuery使用不习惯&#xff0c;新html页面导入vue3,element plus做界面&#xff0c;现在需要把日历上英文切成中文。 最终效果&#xff1a; 导入能让element plus日历变成中文脚本&#xff1a; elementplus, vue3对应的js都可以通过创建一个vu…

修改 docker /dev/shm 的大小

修改 docker /dev/shm 的大小 1&#xff0c;获取完整id&#xff1a; docker inspect 245| grep Id rootlynxi:~# docker inspect 245| grep Id"Id": "245ab167ed9a79873b31b3a38df2053870fe72f267c3c1a660df25c63e37e88b",2&#xff0c;修改 ShmSize&…

vueRouter 配合 keep-alive 不生效的问题

文章目录 问题说明案例复现demo 结构问题复现和解决 其实这个不生效的问题根本也不算一个问题&#xff0c;犯的错和写错单词差不多&#xff0c;但是也是一时上头没发现&#xff0c;所以记录一下&#xff0c;如果遇到同样的问题&#xff0c;也希望可以帮助你早点看到这个哭笑不得…

网络技术基础入门全套实验-厦门微思网络CCNA实验手册

知识改变命运&#xff0c;技术就是要分享&#xff0c;有问题随时联系&#xff0c;免费答疑&#xff0c;欢迎联系&#xff01; 微思简介&#xff08;https://www.xmws.cn) 微思成立于2002年&#xff0c;是一个诚信敬业、积极向上、充满活力、专注技术服务的企业。 微思获得了八…

【SpringBoot+dubbo+zk】实现服务之间rpc通信

0)前置准备&#xff0c;我们使用zk作为注册中心&#xff0c;先启动zk&#xff0c;也就是2181端口。 1)父工程pom.xml <?xml version"1.0" encoding"UTF-8"?> <project xmlns"http://maven.apache.org/POM/4.0.0"xmlns:xsi"http…