static async getESRecovery (req, res) {
    const sortField = (req.query.sortField || 'index') + (req.query.desc === 'true' ? ':desc' : '');
    const options = ViewerUtils.addCluster(req.query.cluster);

    try {
      const { body: recoveries } = await Db.recovery(sortField, req.query.show !== 'all', options.cluster);
      let regex;
      if (req.query.filter !== undefined) {
        try {
          regex = new RE2(req.query.filter);
        } catch (e) {
          return res.serverError(500, `Regex Error: ${e}`);
        }
      }

      let result = [];

      for (const recovery of recoveries) {
        // filtering
        if (regex && !recovery.index.match(regex) &&
          !recovery.target_node.match(regex) &&
          !recovery.source_node.match(regex)) {
          continue;
        }

        result.push(recovery);
      }

      // Work around for https://github.com/elastic/elasticsearch/issues/48070
      if (req.query.sortField && req.query.sortField.endsWith('_percent')) {
        const sf = req.query.sortField;
        if (req.query.desc === 'true') {
          result = result.sort((a, b) => { return parseFloat(b[sf]) - parseFloat(a[sf]); });
        } else {
          result = result.sort((a, b) => { return parseFloat(a[sf]) - parseFloat(b[sf]); });
        }
      }

      res.send({
        data: result,
        recordsFiltered: result.length,
        recordsTotal: recoveries.length
      });
    } catch (err) {
      console.log(`ERROR - ${req.method} /api/esrecovery`, util.inspect(err, false, 50));
      return res.send({
        data: [],
        recordsTotal: 0,
        recordsFiltered: 0
      });
    }
  }
GET - /api/esrecovery

Returns information about ongoing and completed shard recoveries for indices.
@name /esrecovery
@param {string} filter - Search text to filter the list of indices by.
@param {string} sortField=index - The field to sort the indices by.
@param {string} desc=false - Whether to return the results in descending order. Defaults to "false".
@param {string} show=active - Whether to show "all" or "active" recovering indices.
@returns {array} data - List of indices with their corresponding stats.
@returns {number} recordsTotal - The total number of indices.
@returns {number} recordsFiltered - The number of indices returned in this result.