static getESIndices (req, res) {
    async.parallel({
      indices: async () => await Db.indicesCache(req.query.cluster),
      indicesSettings: async () => await Db.indicesSettingsCache(req.query.cluster)
    }, (err, results) => {
      if (err) {
        console.log(`ERROR - ${req.method} /api/esindices`, util.inspect(err, false, 50));
        return res.send({
          recordsTotal: 0,
          recordsFiltered: 0,
          data: []
        });
      }

      const indices = results.indices;
      const indicesSettings = results.indicesSettings;

      if (!Array.isArray(indices)) {
        return res.serverError(500, 'No results');
      }

      let findices = [];

      // filtering
      if (req.query.filter !== undefined) {
        try {
          const regex = new RE2(req.query.filter);
          for (const index of indices) {
            if (!index.index.match(regex)) { continue; }
            findices.push(index);
          }
        } catch (e) {
          return res.serverError(500, `Regex Error: ${e}`);
        }
      } else {
        findices = indices;
      }

      // Add more fields from indicesSettings
      for (const index of findices) {
        if (!indicesSettings[index.index]) { continue; }

        if (indicesSettings[index.index].settings['index.routing.allocation.require.molochtype']) {
          index.molochtype = indicesSettings[index.index].settings['index.routing.allocation.require.molochtype'];
        }

        if (indicesSettings[index.index].settings['index.routing.allocation.total_shards_per_node']) {
          index.shardsPerNode = indicesSettings[index.index].settings['index.routing.allocation.total_shards_per_node'];
        }

        index.creationDate = parseInt(indicesSettings[index.index].settings['index.creation_date']);
        index.versionCreated = parseInt(indicesSettings[index.index].settings['index.version.created']);
        index.docSize = index['docs.count'] === '0' ? 0 : Math.ceil(parseInt(index['store.size']) / parseInt(index['docs.count']));
      }

      // sorting
      const sortField = req.query.sortField || 'index';
      if (sortField === 'index' || sortField === 'status' || sortField === 'health') {
        if (req.query.desc === 'true') {
          findices = findices.sort((a, b) => { return b[sortField].localeCompare(a[sortField]); });
        } else {
          findices = findices.sort((a, b) => { return a[sortField].localeCompare(b[sortField]); });
        }
      } else {
        if (req.query.desc === 'true') {
          findices = findices.sort((a, b) => { return b[sortField] - a[sortField]; });
        } else {
          findices = findices.sort((a, b) => { return a[sortField] - b[sortField]; });
        }
      }

      // send result
      return res.send({
        recordsTotal: indices.length,
        recordsFiltered: findices.length,
        data: findices
      });
    });
  }
GET - /api/esindices

Fetches a list of OpenSearch/Elasticsearch indices.
@name /esindices
@param {string} filter - Search text to filter the list of OpenSearch/Elasticsearch indices by.
@param {string} sortField=index - The field to sort the OpenSearch/Elasticsearch indices list by.
@param {string} desc=false - Whether to return the results in descending order. Defaults to "false".
@returns {array} data - List of ES indices with their corresponding stats.
@returns {number} recordsTotal - The total number of ES indices.
@returns {number} recordsFiltered - The number of ES indices returned in this result.