优化Elasticsearch查询

时间:2018-07-10 10:13:48

标签: elasticsearch optimization aws-elasticsearch

我们有一个ES群集设置,其中包含3个主节点(c4.xlarge.elasticsearch)和3个数据节点(c4.xlarge.elasticsearch),并且使用5个分片的单个索引。

我们在此集群中索引了约3000万条记录,并且正在努力优化我们的选择查询(我们编写的脚本能够向该ES集群触发1000-1500个并行查询)。

我们意识到,在这种重负载下,选择需要3300毫秒(如ES响应中的关键部分所述)。

然后我们使用Profile API深入了解这些数字。

对于每个分片,上面报告的查询时间为(10410196、9969214、33323904、35199400、17725846)纳秒,介于1到3.5毫秒之间。

{
  "type": "BooleanQuery",
  "description": "#type:[1 TO 1] #query_uuid:5282b830-ab5b-48e0-aacc-7fbaafcd3179",
  "time_in_nanos": 17725846,
  "breakdown": {
    "score": 0,
    "build_scorer_count": 40,
    "match_count": 0,
    "create_weight": 663288,
    "next_doc": 3130748,
    "match": 0,
    "create_weight_count": 1,
    "next_doc_count": 498,
    "score_count": 0,
    "build_scorer": 13931271,
    "advance": 0,
    "advance_count": 0
  }
}

通读文档,我们了解总查询时间也会受到收集器时间的影响

  "collector": [
    {
      "name": "CancellableCollector",
      "reason": "search_cancelled",
      "time_in_nanos": 25127530,
      "children": [
        {
          "name": "MultiCollector",
          "reason": "search_top_hits",
          "time_in_nanos": 17963249
        }
      ]
    }
  ]

在这种情况下,每个分片分别为31831976、22071150、56140508、27768799、25127530,即30到50毫秒之间。

收集器需要30到50毫秒,而查询时间需要1到3.5毫秒,而'took'字段在响应中报告的时间不超过3.3秒。

我们遇到的困难是,聚集来自每个分片的响应并返回给客户端的主节点占用了剩余时间。有人可以帮助我们了解原因并减少这些时间吗?

以下是我们正在使用的架构供您参考。

{
  "mappings": {
    "_doc": {
      "_doc": {
        "properties": {
          "action_id": {
            "type": "integer"
          },
          "amount_in_base_currency": {
            "type": "scaled_float",
            "scaling_factor": 100000
          },
          "client_id": {
            "type": "integer"
          },
          "has_commission": {
            "type": "boolean"
          },
          "created_at": {
            "type": "integer"
          },
          "from_uuid": {
            "type": "keyword",
            "copy_to": "query_uuid"
          },
          "id": {
            "type": "keyword"
          },
          "status": {
            "type": "byte"
          },
          "to_uuid": {
            "type": "keyword",
            "copy_to": "query_uuid"
          },
          "transaction_hash": {
            "type": "keyword"
          },
          "transfer_events": {
            "properties": {
              "amount_in_base_currency": {
                "type": "scaled_float",
                "scaling_factor": 100000
              },
              "from_address": {
                "type": "keyword"
              },
              "from_uuid": {
                "type": "keyword"
              },
              "to_address": {
                "type": "keyword"
              },
              "to_uuid": {
                "type": "keyword"
              }
            }
          },
          "type": {
            "type": "byte"
          },
          "updated_at": {
            "type": "integer"
          },
          "query_uuid": {
            "type": "text",
            "analyzer": "whitespace"
          }
        }
      }
    }
  }
}

以下是我们正在尝试优化的查询。

{
  "query": {
    "bool": {
      "filter": [
        {
          "term": {
            "type": "1"
          }
        },
        {
          "match": {
            "query_uuid": "5282b830-ab5b-48e0-aacc-7fbaafcd3179"
          }
        }
      ]
    }
  },
  "from": 0,
  "size": 10,
  "sort": [
    {
      "created_at": "desc"
    }
  ]
}

0 个答案:

没有答案