目录

Elasticsearch查询优化

概述

参考自一篇 博文 ,简单记录一下在进行 es 查询时候应该注意的一些问题 另外还有一篇关于查询 tuning 的 博文 ,参考一下 30x Faster Elasticsearch Queries 有一篇官方 tuning 的文档 General recommendations 一篇中文的 优化策略

关于如何优化查询语句,博文有一句概述比较言简意赅:

Understanding how filters work is essential to making searches faster. A lot of search optimization is really about how to use filters, where to place them and when to (not) cache them.

很多查询的优化都是关于如何应用 filter,哪里使用 filter 以及 什么时候对 filter 采用 cache。

如何应用Filters

A rule of thumb is to use filters when you can and queries when you must: when you need the actual scoring from the queries.

在某些应用条件下,应该避免使用 query 而是直接使用 filter,因为 filter 更快。

组合不同的Filters

You should probably always use bool and not and or or. Order filters by their selectivity.

关于日期的使用

Queries on date fields that use now are typically not cacheable since the range that is being matched changes all the time.

关于毫秒的使用

有相关博文提示,用 second 来替代 millseconds 的查询语句,能获得近30倍的性能提升。此类性能的提升不适用于换成 minute 或者 hour 级别的单位。

Digging into the problem, we noticed it was isolated to queries which involved a timestamp.

需要注意时间戳的存储格式。es 内建的一些时间格式,其中有包括 millseconds。

缓存和加速的 Filter

缓存和加速的 Filter 才是 ES 查询快速的原因。 针对那些专一化很高的查询,是完全没有必要采用缓存的,因为很大概率,不会被应用到下次的查询当中。

Similarly, Elasticsearch does not cache any time filter using the now keyword in date math unless a rounding is specified.

上述语句表达了 ES 不会针对那种 date 类型的字段来进行缓存的,所以此类查询是会比较耗时的。 比较一下 timestamp >= 'now-1h'timestamp >= 'now/1d' AND timestamp >= 'now - 1h',显然后者会因为天级别的查询来获得缓存,

关于 multisearch 的性能

可以参考 官方讨论

关于副本的设置

Usually, the setup that has fewer shards per node in total will perform better.

es 查询优化

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
{
  "query": {
    "bool": {
      "filter": [
        {
          "terms": {
            "prediction": [
              "-1",
              "-2",
              "3",
              "6",
              "7"
            ]
          }
        },
        {
          "bool": {
            "should": [
              {
                "term": {
                  "bivt": {
                    "value": "188"
                  }
                }
              }
            ]
          }
        }
      ]
    }
  },
  "size": 1000,
  "sort": [
    {
      "ct": {
        "missing": "_last",
        "order": "desc"
      }
    }
  ]
}
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
{
  "query": {
    "bool": {
      "should": [
        {
          "term": {
            "bivt": {
              "value": "188"
            }
          }
        }
      ],
      "must_not": [
        {
          "terms": {
            "prediction": [
              "-1",
              "-2",
              "3",
              "6",
              "7"
            ]
          }
        }
      ]
    }
  },
  "size": 1000,
  "sort": [
    {
      "ct": {
        "missing": "_last",
        "order": "desc"
      }
    }
  ]
}
警告
本文最后更新于 2017年2月1日,文中内容可能已过时,请谨慎参考。