一、背景

每周统计接口耗时,发现耗时较长的前几个接口tp5个9都超过了1000ms。

经过分析慢查询的原因是ES查询耗时太长导致的

二、设计方案

1、问题定位

查询功能使用不当导致慢查询

索引设计存在不合理的地方,导致慢查询

2、方案概述

2.1、查询Fetch Source优化

  • 问题

业务查询语句获取的数据集比较大,并且从source中获取了非必须的字段,导致查询较慢。

举例:只需要从es中查询id这一个字段,却把所有字段查询了出来

  • 分析

因为数据集较大,若每个字段都去source中获取所需字段,会导致耗时严重增加,需要避免这种操作,可以大大降低es集群,网络和客户端的压力,提高程序的性能。

  • 优化方法

查语句查询时,将fetchSource设置为false

2.2、查询优化,调整filter过滤顺序

  • 问题

    过滤效果不明显的条件放在了前面,导致查询出大量不需要的数据,导致查询变慢

  • 优化方法

    把过滤效果明显的条件提前,按照过滤效果把过滤条件排序

2.3、索引时间精度优化

  • 分析

降低时间精度。研究Filter的工作原理可以看出,它每次工作都是遍历整个索引的,所以时间粒度越大,对比越快,搜索时间越短,在不影响功能的情况下,时间精度越低越好,有时甚至牺牲一点精度也值得,当然最好的情况是根本不作时间限制。

  • 优化方法

    es重新刷索引,增加冗余的时间字段,精确到天。

    带有时间范围的查询使用该字段进行查询

2.4、索引优化,合理使用keyword类型

  • 分析

    ES5.x里对数值型字段做TermQuery可能会很慢。

    在ES5.x+里,一定要注意数值类型是否需要做范围查询,看似数值,但其实只用于Term或者Terms这类精确匹配的,应该定义为keyword类型。

    ES 2.x -> 5.x升级对于数值类型和Term Query有何重大变化?

    1. Lucene6.0引入了重新设计的数值类型的索引结构,不再采用倒排索,而是使用了更适合范围查找的Block K-d Tree。 ES从5.0开始引入这种新结构

    2. Term Query由于通常非常快,从5.1.1开始不再被缓存到Query Cache

    有兴趣的可以看一下详细分析:https://elasticsearch.cn/article/446

  • 优化方法

    把不做范围查询的数值类型修改为keyword类型

3、reIndex索引

  1. 先在管理平台创建新索引模板。模板名:xxx_new,设置索引生成规则

  2. 在导数据之前将新索引副本数设为0,这样导数据速度较快,导完数据再改为1 即可

  3. 通过脚本执行reIndex操作,需要记录开始时间time​

  4. 再次执行reIndex上次reIndex期间新写入的增量数据(time减去时差8小时) ,这一步的写入可能需要几分钟

  5. 操作动态配置,停止写入ES数据,然后再次reindex这几分钟内写入的增量数据,命令同上(这一次的写入可能就几秒钟了)

  6. 删除旧索引,并将新索引的别名设置为旧索引的名称

  7. 开启写入ES开关,并且重新导入停止写入ES期间的数据,并恢复各索引副本数为1。

【ElasticSearch】查询优化的更多相关文章

  1. Elasticsearch查询优化总结

    查询优化 1 从提高查询精确度进行优化: 本部分主要针对全文搜索进行探究. 1.1 倒排索引 1.1.1 什么是倒排索引: 一个倒排索引由文档中所有不重复词的列表构成,对于其中每个词,有一个包含它的文 ...

  2. elasticsearch 查询优化

    首先对不必要的字段不做分词也就是不做索引,禁止内存交换 1.shard 一个Shard就是一个Lucene实例,是一个完整的搜索引擎. 分片数过多会导致检索时打开比较多的文件,多台服务器之间通讯成本加 ...

  3. 白日梦的Elasticsearch实战笔记,ES账号免费借用、32个查询案例、15个聚合案例、7个查询优化技巧。

    目录 一.导读 二.福利:账号借用 三._search api 搜索api 3.1.什么是query string search? 3.2.什么是query dsl? 3.3.干货!32个查询案例! ...

  4. 白日梦的Elasticsearch实战笔记,32个查询案例、15个聚合案例、7个查询优化技巧。

    目录 一.导读 三._search api 搜索api 3.1.什么是query string search? 3.2.什么是query dsl? 3.3.干货!32个查询案例! 四.聚合分析 4.1 ...

  5. 财务平台亿级数据量毫秒级查询优化之elasticsearch原理解析

    财务平台进行分录分表以后,随着数据量的日渐递增,业务人员对账务数据的实时分析响应时间越来越长,体验性慢慢下降,之前我们基于mysql的性能优化做了一遍,可以说基于mysql该做的优化已经基本上都做了, ...

  6. (转)开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)入门学习资源索引

    Github, Soundcloud, FogCreek, Stackoverflow, Foursquare,等公司通过elasticsearch提供搜索或大规模日志分析可视化等服务.博主近4个月搜 ...

  7. Elasticsearch(GEO)空间检索查询

    Elasticsearch(GEO)空间检索查询python版本 1.Elasticsearch ES的强大就不用多说了,当你安装上插件,搭建好集群,你就拥有了一个搜索系统. 当然,ES的集群优化和查 ...

  8. 400+节点的 Elasticsearch 集群运维

    本文首发于InfoQ https://www.infoq.cn/article/1sm0Mq5LyY_021HGuXer 作者:Anton Hägerstrand 翻译:杨振涛 目录: 数据量 版本 ...

  9. 开源分布式搜索平台ELK(Elasticsearch+Logstash+Kibana)入门学习资源索引

    from:  http://www.w3c.com.cn/%E5%BC%80%E6%BA%90%E5%88%86%E5%B8%83%E5%BC%8F%E6%90%9C%E7%B4%A2%E5%B9%B ...

随机推荐

  1. web项目脱敏白名单管理

    写在前面 下午没事, 看一下同事写的脱敏白名单管理功能. 所谓的脱敏就是将页面中查询出的信息列表当中的身份证号及手机号等关键信息部分用*号代替.该功能主要思路是新增一个页面用于配置哪些页面以及页面中哪 ...

  2. epool与select有什么区别

    select在一个进程中打开的最大fd是有限制的,由FD_SETSIZE设置,默认值是2048.不过 epoll则没有这个限制,它所支持的fd上限是最大可以打开文件的数目,这个数字一般远大于2048, ...

  3. mysql5.7的主从切换

    mysql5.7的主从切换 主库: master 10.11.0.211 从库: slave 10.11.0.210 目标:主从切换,将slave切换为master,master切换为slave 一. ...

  4. k8s记录-安装ansible

    ##1.安装1) python版本需要2.6以上,不过通过centos7都会默认安装上python2.7.5,查看方法:python -V2) 添加yum 源a.vim /etc/yum.repos. ...

  5. 【翻译】Flink Table Api & SQL — 性能调优 — 流式聚合

    本文翻译自官网:Streaming Aggregation  https://ci.apache.org/projects/flink/flink-docs-release-1.9/dev/table ...

  6. H3C 开局设置

    简介: 系统菜单  即 [H3C] 模式 一:恢复出厂设置 这个没什么说的,必须Console连接. 连上以后,在启动时Ctrl+B,进入管理启动菜单,删除文件,删除配置文件然后重启即可. Ctrl+ ...

  7. php代码规范->如何写出规范且易于理解的项目代码-ZX版

    2019年5月17日10:50:12 前序: 目前是想到哪写到哪,后面有时间在整理成具体文章 很多时候,PHP代码风格过于自由,导致一个项目有N多种写法风格,有些人为了自己认为的技术"高&q ...

  8. 使用 Alibaba 的 Homebrew 镜像源进行加速

    使用 Alibaba 的 Homebrew 镜像源进行加速 平时我们执行 brew 命令安装软件的时候,跟以下 3 个仓库地址有关: brew.git homebrew-core.git homebr ...

  9. cube-slide组件的应用

    <template> <div> <cube-slide :data="items"/> </div> </template& ...

  10. 【视频开发】opencv不能读取MP4格式文件

    用OpenCV对视频进行处理时,不能打开.mp4格式的文件.后来解决办法是用ffmpeg.exe将mp4文件转码为avi文件,然后再进行处理.但是转码过程比较慢.后来查看opencv源代码,发现它也是 ...