Recently, I had to find the size of an index in Elasticsearch. I could have just built my query using request like this:
var request = require('request'); request.get('http://localhost:9200/' + myIndex + '/_stats' , function (err, res, body) { console.log(res._all.primaries.store.size_in_bytes); });
Fast and easy. Since it’s not available yet in node-elastical, I found it better to add this functionality so that other people can use it. Implementing the stats function wasn’t difficult. It just require parsing options to create the right url and then making the request (with request) to Elasticsearch. I used the Indices Stats API documentation to create the function.
In file client.js
stats: function (options, callback) { var query = [], url = '', hasOptions; if (typeof options === 'function') { callback = options; options = {}; } //Create a copy of options so we can modify it. options = util.merge(options || {}); if (options.index) { url = '/' + encode(Array.isArray(options.index) ? options.index.join(',') : options.index); delete options.index; //Look for types only if there is an index if (options.types) { query.push(encode('types') + '=' + encode( Array.isArray(options.types) ? options.types.join(',') : options.types)); } delete options.types; } url += '/_stats'; util.each(options, function (value, name) { if (value === true || value === false) { value = value ? '1' : '0'; } query.push(encode(name) + '=' + encode(value)); }); if (query.length) { url += '?' + query.join('&'); } this._request(url, { method: 'GET' }, function (err, res) { if(err) { return callback(err, null, res), undefined; } callback(null, res); }); },
In file index.js
stats: function (options, callback) { if (typeof options === 'function') { callback = options; options = {}; } this.client.stats(util.merge(options,{index: this.name}), callback); },