最近在做ES搜索调优,看了一些lucene搜索的文档和代码,本文用于总结调优过程中学到的知识和自己的思考。

在抓到ES慢查询之后,会通过profile或者kibana的Search Profiler console查看具体慢在了哪里。一般在执行profile search之前,需要稍微改变query语句里的查询内容,防止cache影响测试效果。

profile主要包括shard级别的query耗时、query语句rewrite耗时以及最终lucene collector的耗时。

一般主要关注query的耗时,profile返回的query部分详细的展示了被rewrite后的查询语句以及每个子查询的耗时。包括子查询的类型(type),子查询语句(description),子查询耗时(time_in_nanos)和一个breakdown集合包含了lucene segements search各阶段的耗时。从这个breakdown集合中能比较清晰的看到耗时的原因,当然,前提是要理解breakdown里每个指标代表什么意思和内部的实现逻辑。

breakdown里的主要指标及lucene中的实现:

build_scorer:构造一个scorer的耗时。scorer主要用于对matching的doc进行打分和排序。build_scorer内部构造了迭代器,这个迭代器可以遍历所有matched document,构造迭代器是非常耗时的操作,因为涉及到对各子查询的docId结果集构造倒排链或bitset,并且做conjunction生成最终可被迭代的docId bitset或倒排链。大多数查询主要耗时在这一步。

next_doc: 寻找下一个匹配的document Id。这里keyword, text等文本类型的字段会利用skipList,数值类型的数据会利用Tree结构快速找的下一个匹配的docoument Id。同时,这里会记录该doc命中的子查询数量,用于最终的min_should_match之类的过滤。

advance: 类似于一个low level的next_doc。并不是所有的query都能实现next_doc,比如must查询走的advance去找下一个匹配的文档。

score: 记录socrer中对文档打分的耗时,通过Freq,normal等数据结合tf-idf等算法计算出得分。

match: 记录第二阶段打分的耗时。有些查询需要两阶段打分,比如短语查询(phrase query) "chinese love china", 第一阶段先找所有包含“chinese”、“love”、“china”三个term的文档。第二阶段再在第一阶段匹配到到的所有文档中计算“chinese”,"love","china"三个单词的位置和顺序是否满足条件,这一操作非常耗时,所以通过第一阶段缩小匹配文档的范围。

create_weight: 创建weight过程的耗时,weight就相当于lucene查询的context,里面包含了query,collector,indexreader等。

*_count: 记录方法调用次数,比如next_doc_count:2,代表next_doc方法被调用了两次。

除了query过程的详细统计,还包括:

rewrite_time: query语句被重写的耗时,lucene自己维护了一套查询语句重写逻辑,比如terms查询中如果要查询的terms个数小于16,会被重写成多个TermQuery做or结合;如果大于16会被重写成TermInSetQuery。

collector: query数据收集阶段的各种指标。包括query用到的collector的个数,类型和耗时。ES默认使用的是SimpleTopScoreDocCollector。lucene的collector主要通过reduce方法对每个segment上匹配的结果进行合并和排序,返回topN。

故障诊断过程中,除了通过profile API定位慢查询,也需要关注ES集群的整体资源使用情况,比如data node的CPU, Mem, 磁盘IO是否有瓶颈,单节点shard个数是否过多等。一般可以通过cerebro或者elasticsearch_exporter+Prometheus来监控集群状态, 也可以通过ES API查看相关指标。

Elasticsearch慢查询故障诊断的更多相关文章

  1. 【转】elasticsearch的查询器query与过滤器filter的区别

    很多刚学elasticsearch的人对于查询方面很是苦恼,说实话es的查询语法真心不简单-  当然你如果入门之后,会发现elasticsearch的rest api设计是多么有意思. 说正题,ela ...

  2. 基于百度地图SDK和Elasticsearch GEO查询的地理围栏分析系统(1)

    本文描述了一个系统,功能是评价和抽象地理围栏(Geo-fencing),以及监控和分析核心地理围栏中业务的表现. 技术栈:Spring-JQuery-百度地图WEB SDK 存储:Hive-Elast ...

  3. Elasticsearch Kibana查询语法

    Elasticsearch Kibana查询语法 2018年06月03日 23:52:30 wangpei1949 阅读数:3992   Elasticsearch Kibana Discover的搜 ...

  4. ElasticSearch—分页查询

    ElasticSearch查询—分页查询详解 Elasticsearch中数据都存储在分片中,当执行搜索时每个分片独立搜索后,数据再经过整合返回.那么,如何实现分页查询呢? 按照一般的查询流程来说,如 ...

  5. Elasticsearch 邻近查询示例

    Elasticsearch 邻近查询示例(全切分分词) JAVA API方式: SpanNearQueryBuilder span = QueryBuilders.spanNearQuery(); s ...

  6. elasticsearch简单查询

    elasticsearch简单查询示例: { "from": "0", //分页,从第一页开始 "size": "10" ...

  7. ElasticSearch高级查询

    ElasticSearch高级查询 https://www.imooc.com/video/15759/0 ElasticSearch查询 1,子条件查询:特定字段查询所指特定值 1.1query c ...

  8. elasticsearch 分页查询实现方案——Top K+归并排序

    elasticsearch 分页查询实现方案 1. from+size 实现分页 from表示从第几行开始,size表示查询多少条文档.from默认为0,size默认为10,注意:size的大小不能超 ...

  9. ELK 学习笔记之 elasticsearch 基本查询

    elasticsearch 基本查询: 基本查询: term查询: terms查询: from和size查询: match查询: match_all查询: match_phrase查询: multi_ ...

随机推荐

  1. 2019-6-23-开源项目使用-appveyor-自动构建

    title author date CreateTime categories 开源项目使用 appveyor 自动构建 lindexi 2019-06-23 11:47:40 +0800 2019- ...

  2. Python traceback模块简单使用

    Python中的traceback模块被用于跟踪异常返回信息,可以在logging中记录下traceback. traceback.format_exc() 获取异常为字符串,保存到日志文件 try: ...

  3. tensorflow兼容处理 tensorflow.compat.v1

    https://www.wandouip.com/t5i183316/ 引言 原来引用过一个段子,这里还要再引用一次.是关于苹果的.大意是,苹果发布了新的开发语言Swift,有非常多优秀的特征,于是很 ...

  4. @NOIP2018 - D1T1@ 铺设道路

    目录 @题目描述@ @考场上的思路@ @比较正常的题解@ @题目描述@ 春春是一名道路工程师,负责铺设一条长度为 n 的道路. 铺设道路的主要工作是填平下陷的地表.整段道路可以看作是 n 块首尾相连的 ...

  5. HZOJ 大佬(kat)

    及其水水水的假期望(然而我已经被期望吓怕了……). 数据范围及其沙雕导致丢掉5分…… 因为其实每天的期望是一样的,考虑分开. f[i][j]表示做k道题,难度最大为j的概率. 则f[i][j]=(f[ ...

  6. WPS修订功能的使用

    WPS设置 设置用户名: 修改之后的效果:

  7. shell Usage

    Usage(){ cat <<EOF Usage: $ [tenant] $ (Run database table check_table_data_config all tenants ...

  8. css实现简单的页面自适应宽度

    1.css样式.lgn{ width:500px; height:20px;}.item_left_yd{ float: left; display: inline-block; width:240p ...

  9. Google Colab 免费GPU服务器使用教程 挂载云端硬盘

    一.前言二.Google Colab特征三.开始使用3.1在谷歌云盘上创建文件夹3.2创建Colaboratory3.3创建完成四.设置GPU运行五.运行.py文件5.1安装必要库5.2 挂载云端硬盘 ...

  10. H3C 数据链路层