This documentation is not maintained. Please refer to doc.castsoftware.com/technologies to find the latest updates.
CAST supports Elasticsearch via its com.castsoftware.nodejs extension. Details about how this support is provided for Node.js source code is discussed below.
Supported Client Libraries
Library | Supported |
---|---|
Elasticsearch |
Supported Operations
Operation | Methods Supported |
---|---|
Insert | index |
Update | update updateByQuery |
Select | search msearch explain get mget |
Delete | delete deleteByQuery |
Objects
Icon | Description |
---|---|
Node.js Elasticsearch Cluster | |
Node.js Elasticsearch Unknown Cluster | |
Node.js Elasticsearch Index | |
Node.js Elasticsearch Unknown Index |
Links
Links are created for transaction and function point needs:
Link type | Source and destination of link | Methods supported |
---|---|---|
parentLink | Between Elasticsearch Cluster object and Elasticsearch Index object | - |
useXLink | Between the caller Node.js Initialization / Function objects and Elasticsearch Index objects | bulk |
useInsertLink | Between the caller Node.js Initialization / Function objects and Elasticsearch Index objects | index |
useDeleteLink | Between the caller Node.js Initialization / Function objects and Elasticsearch Index objects | delete deleteByQuery |
useSelectLink | Between the caller Node.js Initialization / Function objects and Elasticsearch Index objects | search msearch explain get mget |
useUpdateLink | Between the caller Node.js Initialization / Function objects and Elasticsearch Index objects | update updateByQuery |
What results can you expect?
Some example scenarios are shown below:
Cluster creation
Older version: 16.x
const elasticsearch = require('elasticsearch'); // list of string let client = new elasticsearch.Client({ hosts: [ 'https://[username]:[password]@[server]:[port]/', 'https://[username]:[password]@[server]:[port]/' ] }); // object let client1 = new elasticsearch.Client({ host: { protocol: 'https', host: 'my-site.com', port: 80, path: '/elasticsearch/' } }); // list of object let client2 = new elasticsearch.Client({ hosts: [ { protocol: 'https', host: 'box1.server.org', port: 56394, // these custom values are used below by the selector country: 'EU', weight: 10 }, { protocol: 'https', host: 'box2.server.org', port: 56394, // these custom values are used below by the selector country: 'US', weight: 50 } ] }); // list of string and object let client3 = new elasticsearch.Client({ hosts: [ 'https://[username]:[password]@[server]:[port]/', { protocol: 'https', host: 'my-site.com', port: 80, path: '/elasticsearch/' } ] });
Newer version: >= 5.x
const {Client, errors} = require('@elastic/elasticsearch'); // string const client = new Client({node: 'http://localhost:9200'}); // URL object const client2 = new Client({node: new URL('http://127.0.0.1')}); // list of string and URL object const client3 = new Client({ nodes: [ 'http://192.168.167.1', new URL('google.com') ] });
Insert operation
const response = client.index({ index: 'myindex', type: 'mytype', id: '1', body: { title: 'Test 1', tags: ['y', 'z'], published: true, } });
Update operation
// string let response = client.update({ index: 'indexA', type: 'mytype', id: '1', body: { // put the partial document under the `doc` key doc: { title: 'Updated' } } }); // string response = client.updateByQuery({ index: 'indexB', type: type, body: { "query": {"match": {"animal": "bear"}}, "script": {"inline": "ctx._source.color = 'pink'"} } }, function (err, res) { if (err) { reportError(err) } cb(err, res) } ); // list of string response = client.updateByQuery({ index: ['indexC', 'indexD'], type: type, body: { "query": {"match": {"animal": "bear"}}, "script": {"inline": "ctx._source.color = 'pink'"} } }, function (err, res) { if (err) { reportError(err) } cb(err, res) } );
Select operation
let response = client.get({ index: 'indexA', type: 'mytype', id: 1 });
Delete operation
client.delete({ index: 'indexA', type: 'mytype', id: '1' });
Bulk
client.bulk({ body: [ // action description { index: { _index: 'indexA', _type: 'mytype', _id: 1 } }, // the document to index { title: 'foo' }, // action description { update: { _index: 'indexB', _type: 'mytype', _id: 2 } }, // the document to update { doc: { title: 'foo' } }, // action description { delete: { _index: 'indexC', _type: 'mytype', _id: 3 } }, // no document needed for this delete ] }, function (err, resp) { // ... });
Known Limitations
- For HTML5 Extension version < ...
Identifiers inside a hardcoded list into a dictionary are not resolved, see:
// LIMITATION a = 'foo' client.updateByQuery({ index: ['bar', a] // In this case « a » won't be resolved }); // NO LIMITATION b = ['bar', a]; client.updateByQuery({ index: b // In this case « a » will be resolved });
- Operation operating on all indexes (no index argument or index = _all) do not create links
Using client inside object is not supported, see:
// In wrapper.js const elasticsearch = require('elasticsearch'); var self = {}; self.client = new elasticsearch.Client({ host: 'client.org' }); module.exports = self; //---------------------------------------------------------- // In app.js const ElasticsearchWrapper = require('./wrapper.js'); ElasticsearchWrapper.client.deleteByQuery({ // -> this call won't be detected as the client is wrapped inside an object index: 'some_index', }, function (error, response) { if (error) sails.log.info("error ", error); } );