///<summary>GET _stats/{metric_family}
        ///<pre>http://elasticsearch.org/guide/reference/api/admin-indices-stats/</pre>	
        ///</summary>
        ///<param name="metric_family">Limit the information returned to a specific metric</param>
        public Task<ConnectionStatus> IndicesStatsGetAsync(MetricFamilyOptions metric_family, Func<IndicesStatsGetQueryString, IndicesStatsGetQueryString> queryString = null)
        {
            metric_family.ThrowIfNull("metric_family");
            var url = "_stats/{metric_family}".Inject(new { metric_family = Stringify(metric_family) });
            NameValueCollection nv = null;
            if (queryString != null)
            {
                var qs = queryString(new IndicesStatsGetQueryString());
                if (qs != null) nv = qs.NameValueCollection;
            }

            return this.DoRequestAsync("GET", url, data: null, queryString: nv);
        }
        ///<summary>GET /_nodes/{node_id}/stats/{metric_family}
        ///<pre>http://elasticsearch.org/guide/reference/api/admin-cluster-nodes-stats/</pre>	
        ///</summary>
        ///<param name="metric_family">Limit the information returned to a certain metric family</param>
        ///<param name="node_id">A comma-separated list of node IDs or names to limit the returned information; use `_local` to return information from the node you&#39;re connecting to, leave empty to get information from all nodes</param>
        public Task<ConnectionStatus> ClusterNodeStatsGetAsync(MetricFamilyOptions metric_family, string node_id, Func<ClusterNodeStatsGetQueryString, ClusterNodeStatsGetQueryString> queryString = null)
        {
            metric_family.ThrowIfNull("metric_family");
            node_id.ThrowIfNull("node_id");
            var url = "/_nodes/{node_id}/stats/{metric_family}".Inject(new { metric_family = Stringify(metric_family), node_id = Stringify(node_id) });
            NameValueCollection nv = null;
            if (queryString != null)
            {
                var qs = queryString(new ClusterNodeStatsGetQueryString());
                if (qs != null) nv = qs.NameValueCollection;
            }

            return this.DoRequestAsync("GET", url, data: null, queryString: nv);
        }
        ///<summary>GET /{index}/_stats/{metric_family}
        ///<pre>http://elasticsearch.org/guide/reference/api/admin-indices-stats/</pre>	
        ///</summary>
        ///<param name="index">A comma-separated list of index names; use `_all` or empty string to perform the operation on all indices</param>
        ///<param name="metric_family">Limit the information returned to a specific metric</param>
        public ConnectionStatus IndexStatsGet(string index, MetricFamilyOptions metric_family, Func<IndicesStatsGetQueryString, IndicesStatsGetQueryString> queryString = null)
        {
            index.ThrowIfNull("index");
            metric_family.ThrowIfNull("metric_family");
            var url = "/{index}/_stats/{metric_family}".Inject(new { index = Stringify(index), metric_family = Stringify(metric_family) });
            NameValueCollection nv = null;
            if (queryString != null)
            {
                var qs = queryString(new IndicesStatsGetQueryString());
                if (qs != null) nv = qs.NameValueCollection;
            }

            return this.DoRequest("GET", url, data: null, queryString: nv);
        }