2

I am working on a project which has following setup:

  • I have an Amazon EC2 cluster with one master, 3 config servers and 3 shard servers.
  • Master has a node.js application running which is basically a REST API written using Express.js module.
  • I am using mongodb as database. Master has "mongos" service running which shards the data into 3 shard servers. Those servers have "mongod" service running on them.

With this setup, I want to integrate elasticsearch to perform search queries. To do this I want to add a route in my node.js REST API application to perform search query on the data stored in shards.

Are there any additional steps involved given that I have three shards running on independent machines? How do I configure elasticsearch to access the data from the shards to build index? Does it detect this configuration automatically and builds the index? Can someone please provide me the steps that I should follow to accomplish this?

3
  • Read ES docs, all your questions have answers there Commented Jul 17, 2016 at 17:19
  • @VsevolodGoloviznin Thank you for your response. Can you point me to some resource? Commented Jul 17, 2016 at 19:23
  • just google for ES documentation Commented Jul 17, 2016 at 19:27

1 Answer 1

3

I have done it this way:

I am using sails.js framework for node and using mongo as DB.

First of all, i've installed elasticsearch module using npm. Then added this code in a file called elasticSeach.js in config section.

It has the following code:

var elasticsearch = require('elasticsearch'),

  index = "Ur_elastic_index_name_goes_here",
  client = new elasticsearch.Client({
    host: 'localhost:9200',
    log: 'trace'
  });

module.exports.elasticSearchClient = client;

module.exports.elasticSearchConfig = {
  index: index
};

After that, simply create a file ElasticSearchService.js in which you will do all the operations like search, update etc. Here is an example of an elasticsearch index method to index the values, which takes :

a) type

b) item, which is an object of json type like

item = {
 "name" : "vishal",
 "website" : "stackOverflow"
};

and method is

function indexItem(type, item) {
  return Q.promise(function(resolve, reject){
    elasticSearchClient
      .index({
        index: elasticSearchConfig.index,
        type: type,
        body: item
      })
      .then(function (response) {
        sails.log.info("ElasticSearchService#indexItem :: Response :: ", response);
        return resolve(response);
      })
      .catch(function(err) {
        sails.log.error("ElasticSearchService#indexItem :: Error :: ", err);
        return reject(err);
      });
  });
}

Call this method from wherever you want.

I am using a promise to return values. You don't need to worry about shard implementation and all. Elastic takes care of that.

More about type and mappings here : https://www.elastic.co/guide/en/elasticsearch/guide/current/mapping.html

Sign up to request clarification or add additional context in comments.

Comments

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.