Support for Elasticsearch v7.8.edit

You can find all the API changes here.

Added multi search helper #1186edit

If you are sending search request at a high rate, this helper might be useful for you. It will use the mutli search API under the hood to batch the requests and improve the overall performances of your application.
The result exposes a documents property as well, which allows you to access directly the hits sources.

const { Client } = require('@elastic/elasticsearch')

const client = new Client({ node: 'http://localhost:9200' })
const m = client.helpers.msearch()

// promise style API
    { index: 'stackoverflow' },
    { query: { match: { title: 'javascript' } } }
  .then(result => console.log(result.body)) // or result.documents
  .catch(err => console.error(err))

// callback style API
  { index: 'stackoverflow' },
  { query: { match: { title: 'ruby' } } },
  (err, result) => {
    if (err) console.error(err)
    console.log(result.body)) // or result.documents

Added timeout support in bulk and msearch helpers #1206edit

If there is a slow producer, the bulk helper might send data with a very large period of time, and if the process crashes for any reason, the data would be lost. This pr introduces a flushInterval option in the bulk helper to avoid this issue. By default, the bulk helper will flush the data automatically every 30 seconds, unless the threshold has been reached before.

const b = client.helpers.bulk({
  flushInterval: 30000

The same problem might happen with the multi search helper, where the user is not sending search requests fast enough. A flushInterval options has been added as well, with a default value of 500 milliseconds.

const m = client.helpers.msearch({
  flushInterval: 500


Use filter_path for improving the search helpers performances #1199edit

From now on, all he search helpers will use the filter_path option automatically when needed to retrieve only the hits source. This change will result in less netwprk traffic and improved deserialization performances.

Search helpers documents getter #1186edit

Before this, the documents key that you can access in any search helper was computed as soon as we got the search result from Elasticsearch. With this change the documents key is now a getter, which makes this procees lazy, resulting in better performances and lower memory impact.



Disable client Helpers in Node.js < 10 - #1194edit

The client helpers can’t be used in Node.js < 10 because it needs a custom flag to be able to use them. Given that not every provider allows the user to specify cuatom Node.js flags, the Helpers has been disabled completely in Node.js < 10.

Force lowercase in all headers - #1187edit

Now all the user-provided headers names will be lowercased by default, so there will be no conflicts in case of the same header with different casing.



Support for Elasticsearch v7.7.edit

You can find all the API changes here.

Introduced client helpers - #1107edit

From now on, the client comes with an handy collection of helpers to give you a more comfortable experience with some APIs.

The client helpers are experimental, and the API may change in the next minor releases.

The following helpers has been introduced:

  • client.helpers.bulk
  • client.helpers.scrollSearch
  • client.helpers.scrollDocuments

The ConnectionPool.getConnection now always returns a Connection - #1127edit

What does this mean? It means that you will see less NoLivingConnectionError, which now can only be caused if you set a selector/filter too strict. For improving the debugging experience, the NoLivingConnectionsError error message has been updated.

Abortable promises - #1141edit

From now on, it will be possible to abort a request generated with the promise-styl API. If you abort a request generated from a promise, the promise will be rejected with a RequestAbortedError.

const promise ={
  body: {
    query: { match_all: {} }



Major refactor of the Type Definitions - #1119 #1130 #1132edit

Now every API makes better use of the generics and overloading, so you can (or not, by default request/response bodies are Record<string, any>) define the request/response bodies in the generics.

// request and response bodies are generics
// response body is `SearchResponse` and request body is generic<SearchResponse>(...)
// request body is `SearchBody` and response body is `SearchResponse`<SearchResponse, SearchBody>(...)

This should not be a breaking change, as every generics defaults to any. It might happen to some users that the code breaks, but our test didn’t detect any of it, probably because they were not robust enough. However, given the gigantic improvement in the developer experience, we have decided to release this change in the 7.x line.


The ConnectionPool.update method now cleans the dead list - #1122 #1127edit

It can happen in a situation where we are updating the connections list and running sniff, leaving the dead list in a dirty state. Now the ConnectionPool.update cleans up the dead list every time, which makes way more sense given that all the new connections are alive.

ConnectionPoolmarkDead should ignore connections that no longer exists - #1159edit

It might happen that markDead is called just after a pool update, and in such case, the clint was adding the dead list a node that no longer exists, causing unhandled exceptions later.

Do not retry a request if the body is a stream - #1143edit

The client should not retry if it’s sending a stream body, because it should store in memory a copy of the stream to be able to send it again, but since it doesn’t know in advance the size of the stream, it risks to take too much memory. Furthermore, copying everytime the stream is very an expensive operation.

Return an error if the request has been aborted - #1141edit

Until now, aborting a request was blocking the HTTP request, but never calling the callback or resolving the promise to notify the user. This is a bug because it could lead to dangerous memory leaks. From now on if the user calls the request.abort() method, the callback style API will be called with a RequestAbortedError, the promise will be rejected with RequestAbortedError as well.



  • Secure json parsing - #1110
  • ApiKey should take precedence over basic auth - #1115


  • Fix typo in api reference - #1109


Support for Elasticsearch v7.6.



  • Skip compression in case of empty string body - #1080
  • Fix typo in NoLivingConnectionsError - #1045
  • Change TransportRequestOptions.ignore to number[] - #1053
  • ClientOptions["cloud"] should have optional auth fields - #1032


  • Docs: Return super in example Transport subclass - #980
  • Add examples to reference - #1076
  • Added new examples - #1031


Support for Elasticsearch v7.5.


  • X-Opaque-Id support #997


Support for Elasticsearch v7.4.


  • Fix issue; node roles are defaulting to true when undefined is breaking usage of nodeFilter option - #967


  • Updated API reference doc - #945 #969
  • Fix inaccurate description sniffEndpoint - #959


  • Update code generation #969


Support for Elasticsearch v7.3.


  • Added auth option - #908
  • Added support for ApiKey authentication - #908


  • fix(Typings): sniffInterval can also be boolean - #914


  • Refactored connection pool - #913


  • Better reference code examples - #920
  • Improve README - #909


Support for Elasticsearch v7.2


  • Remove auth data from inspect and toJSON in connection class - #887


Support for Elasticsearch v7.1


  • Support for non-friendly chars in url username and password - #858
  • Patch deprecated parameters - #851



  • Fix TypeScript export (issue #841) - #842
  • Fix http and https port handling (issue #843) - #845
  • Fix TypeScript definiton (issue #803) - #846
  • Added toJSON method to Connection class (issue #848) - #849


Support for Elasticsearch v7.0

  • Stable release.