首页 > 其他分享 >ElasticSearch 性能优化

ElasticSearch 性能优化

时间:2024-01-08 16:31:48浏览次数:24  
标签:index 副本 性能 查询 索引 range ElasticSearch 优化 price


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


标签:index,副本,性能,查询,索引,range,ElasticSearch,优化,price
From: https://blog.51cto.com/u_15651175/9146850

相关文章

  • 【测试运维】性能测试知识笔记第1篇:性能测试分类和参数(已分享,附代码)
    本系列文章md笔记(已分享)主要讨论性能测试相关知识。入门阶段:认识性能测试分类-(负载测试、压力测试、并发测试、稳定性测试),常用性能测试指标-(吞吐量、并发数、响应时间、点击数...),性能测试工具选择。性能脚本:1.LoadRunner介绍,2.脚本录制、运行、参数化,3.关联、检查点、事务......
  • 高性能计算在生物信息学研究中的地位
    1.背景介绍生物信息学是一门研究生物数据的科学,它涉及到生物学、计算机科学、数学、统计学等多个领域的知识和技术。随着生物科学的发展,生物信息学也在不断发展和进步,成为生物科学研究的重要一部分。高性能计算在生物信息学研究中发挥着越来越重要的作用,因为生物信息学研究中涉及的......
  • 神经进化算法在社交网络领域的优化与创新
    1.背景介绍社交网络已经成为了现代人们生活中不可或缺的一部分,它们为我们提供了一种快捷、高效的沟通和交流方式。然而,随着社交网络的不断发展和扩张,它们也面临着各种挑战,如信息过载、网络滥用、虚假账户等。因此,在社交网络领域,优化和创新变得至关重要。神经进化算法(NEA)是一种基于......
  • 雅意2.0:打造专为中文优化的300亿参数多语言模型
    前言雅意2.0,作为一款专注于中文语境的开源大型语言模型,其在多语言处理方面的能力尤为突出。该模型不仅具有300亿参数规模的庞大体量,还在多个关键领域取得了显著的技术突破。Huggingface模型下载:https://huggingface.co/wenge-research/AI快站模型免费加速下载:https://aifasthub.com......
  • Day1 - 大规模Elasticsearch集群管理心得(转)
    转自:https://elasticsearch.cn/article/110 【携程旅行网吴晓刚】 ElasticSearch目前在互联网公司主要用于两种应用场景,其一是用于构建业务的搜索功能模块且多是垂直领域的搜索,数据量级一般在千万至数十亿这个级别;其二用于大规模数据的实时OLAP,经典的如ELKStack,数据规模可能......
  • SpringBoot 接口:响应时间优化9个技巧!
    今天聊聊SpringBoot接口:响应时间优化的9个技巧。在实际开发中,提升接口响应速度是一件挺重要的事,特别是在面临大量用户请求的时候。好了,咱们直接切入正题。本文,已收录于,我的技术网站ddkk.com,有大厂完整面经,工作技术,架构师成长之路,等经验分享在SpringBoot应用中,接口响应时间的优......
  • 优化业务系统运维管理:实现更智能的信息化业务系统监控与决策
        在当今高度信息化的时代,业务管理已成为企业成功的关键因素。为了更好地满足不断变化的市场需求,提高企业运营效率,我们推出了一款全新的业务管理工具——监控易。这款工具将助力企业实现更高效、更智能的业务监控与决策。一、业务系统运维列表:全面掌握业务状态    ......
  • MyBatis批量插入数据优化
    背景介绍我们使用了mybatis-plus框架,并采用其中的saveBatch方法进行批量数据插入。然而,通过深入研究源码,我发现这个方法并没有如我期望的那样高效这是因为最终在执行的时候还是通过for循环一条条执行insert,然后再一批的进行flush,默认批的消息为1000为了找到更优秀的解决方案......
  • day28 基于Loki的日志收集系统-基于Loki特性的场景变现及优化 (9.8-9.9)
    9.8-基于Loki的日志收集系统一、EFKvsLPG架构和组件Loki:Loki是一个开源的水平可扩展日志聚合系统,由Promtail、Loki和Grafana组成。EFK:EFK是一个集成的解决方案,由Elasticsearch、Fluentd和Kibana组成。存储和查询:Loki:Loki使用基于日志流的存储方式,将日志数据存储为可压......
  • 引领流量管理变革:实现高效、智能的网络监控与优化
        在当今高度信息化的时代,网络流量管理已成为企业数据分析和决策的关键环节。为了更好地满足不断变化的市场需求,提高企业运营效率,监控易推出的流量管理模块,将助力企业实现更高效、更智能的流量监控与优化。一、流量监控:实时掌握网络流量动态    监控易的流量监控功......