Using elasticsearch with nodejs

I'm using mongoosastic which is based on the official ElasticSearch client. Mongoosastic is a plugin, which allows me to use ElasticSearch with MongoDB. I've done basic queries like

NodesModel.search({
    "query_string": {
        "query": "developed"
    }
}, function(err, results) {
    console.log(err, JSON.stringify(results));
});

and they work fine. However now I'm trying to enable stemming feature of elasticsearch. I've used the stemming example from the official ES docs, but can't get it working with mongoosastic. I've tried

NodesModel.search({
    "query_string": {
        "query": "developed"
    },

    "index": {
        "analysis": {
            "analyzer": {
                "my_analyzer": {
                    "tokenizer": "standard",
                    "filter": ["standard", "lowercase", "my_stemmer"]
                }
            },
            "filter": {
                "my_stemmer": {
                    "type": "stemmer",
                    "name": "light_german"
                }
            }
        }
    }

}, function(err, results) {
    console.log(err, JSON.stringify(results));
});

The output is the following:

    { [Error: SearchPhaseExecutionException[Failed to execute phase [query], all sha
rds failed; shardFailures {[zn4Omh8tRy-ml0K0lRpMig][nodess][0]: SearchParseExcep
tion[[nodess][0]: query[_all:developed],from[-1],size[-1]: Parse Failure [Failed
 to parse source [{"query":{"query_string":{"query":"developed"},"index":{"analy
sis":{"analyzer":{"my_analyzer":{"tokenizer":"standard","filter":["standard","lo
wercase","my_stemmer"]}},"filter":{"my_stemmer":{"type":"stemmer","name":"light_
german"}}}}}}]]]; nested: ElasticsearchParseException[Expected field name but go
t START_OBJECT "index"]; }{[zn4Omh8tRy-ml0K0lRpMig][nodess][1]: SearchParseExcep
tion[[nodess][1]: query[_all:developed],from[-1],size[-1]: Parse Failure [Failed
 to parse source [{"query":{"query_string":{"query":"developed"},"index":{"analy
sis":{"analyzer":{"my_analyzer":{"tokenizer":"standard","filter":["standard","lo
wercase","my_stemmer"]}},"filter":{"my_stemmer":{"type":"stemmer","name":"light_
german"}}}}}}]]]; nested: ElasticsearchParseException[Expected field name but go
t START_OBJECT "index"]; }{[zn4Omh8tRy-ml0K0lRpMig][nodess][2]: SearchParseExcep
tion[[nodess][2]: query[_all:developed],from[-1],size[-1]: Parse Failure [Failed
 to parse source [{"query":{"query_string":{"query":"developed"},"index":{"analy
sis":{"analyzer":{"my_analyzer":{"tokenizer":"standard","filter":["standard","lo
wercase","my_stemmer"]}},"filter":{"my_stemmer":{"type":"stemmer","name":"light_
german"}}}}}}]]]; nested: ElasticsearchParseException[Expected field name but go
t START_OBJECT "index"]; }{[zn4Omh8tRy-ml0K0lRpMig][nodess][3]: SearchParseExcep
tion[[nodess][3]: query[_all:developed],from[-1],size[-1]: Parse Failure [Failed
 to parse source [{"query":{"query_string":{"query":"developed"},"index":{"analy
sis":{"analyzer":{"my_analyzer":{"tokenizer":"standard","filter":["standard","lo
wercase","my_stemmer"]}},"filter":{"my_stemmer":{"type":"stemmer","name":"light_
german"}}}}}}]]]; nested: ElasticsearchParseException[Expected field name but go
t START_OBJECT "index"]; }{[zn4Omh8tRy-ml0K0lRpMig][nodess][4]: SearchParseExcep
tion[[nodess][4]: query[_all:developed],from[-1],size[-1]: Parse Failure [Failed
 to parse source [{"query":{"query_string":{"query":"developed"},"index":{"analy
sis":{"analyzer":{"my_analyzer":{"tokenizer":"standard","filter":["standard","lo
wercase","my_stemmer"]}},"filter":{"my_stemmer":{"type":"stemmer","name":"light_
german"}}}}}}]]]; nested: ElasticsearchParseException[Expected field name but go
t START_OBJECT "index"]; }]]
  message: 'SearchPhaseExecutionException[Failed to execute phase [query], all s
hards failed; shardFailures {[zn4Omh8tRy-ml0K0lRpMig][nodess][0]: SearchParseExc
eption[[nodess][0]: query[_all:developed],from[-1],size[-1]: Parse Failure [Fail
ed to parse source [{"query":{"query_string":{"query":"developed"},"index":{"ana
lysis":{"analyzer":{"my_analyzer":{"tokenizer":"standard","filter":["standard","
lowercase","my_stemmer"]}},"filter":{"my_stemmer":{"type":"stemmer","name":"ligh
t_german"}}}}}}]]]; nested: ElasticsearchParseException[Expected field name but
got START_OBJECT "index"]; }{[zn4Omh8tRy-ml0K0lRpMig][nodess][1]: SearchParseExc
eption[[nodess][1]: query[_all:developed],from[-1],size[-1]: Parse Failure [Fail
ed to parse source [{"query":{"query_string":{"query":"developed"},"index":{"ana
lysis":{"analyzer":{"my_analyzer":{"tokenizer":"standard","filter":["standard","
lowercase","my_stemmer"]}},"filter":{"my_stemmer":{"type":"stemmer","name":"ligh
t_german"}}}}}}]]]; nested: ElasticsearchParseException[Expected field name but
got START_OBJECT "index"]; }{[zn4Omh8tRy-ml0K0lRpMig][nodess][2]: SearchParseExc
eption[[nodess][2]: query[_all:developed],from[-1],size[-1]: Parse Failure [Fail
ed to parse source [{"query":{"query_string":{"query":"developed"},"index":{"ana
lysis":{"analyzer":{"my_analyzer":{"tokenizer":"standard","filter":["standard","
lowercase","my_stemmer"]}},"filter":{"my_stemmer":{"type":"stemmer","name":"ligh
t_german"}}}}}}]]]; nested: ElasticsearchParseException[Expected field name but
got START_OBJECT "index"]; }{[zn4Omh8tRy-ml0K0lRpMig][nodess][3]: SearchParseExc
eption[[nodess][3]: query[_all:developed],from[-1],size[-1]: Parse Failure [Fail
ed to parse source [{"query":{"query_string":{"query":"developed"},"index":{"ana
lysis":{"analyzer":{"my_analyzer":{"tokenizer":"standard","filter":["standard","
lowercase","my_stemmer"]}},"filter":{"my_stemmer":{"type":"stemmer","name":"ligh
t_german"}}}}}}]]]; nested: ElasticsearchParseException[Expected field name but
got START_OBJECT "index"]; }{[zn4Omh8tRy-ml0K0lRpMig][nodess][4]: SearchParseExc
eption[[nodess][4]: query[_all:developed],from[-1],size[-1]: Parse Failure [Fail
ed to parse source [{"query":{"query_string":{"query":"developed"},"index":{"ana
lysis":{"analyzer":{"my_analyzer":{"tokenizer":"standard","filter":["standard","
lowercase","my_stemmer"]}},"filter":{"my_stemmer":{"type":"stemmer","name":"ligh
t_german"}}}}}}]]]; nested: ElasticsearchParseException[Expected field name but
got START_OBJECT "index"]; }]' } undefined

as I see the mongoosastic passes the first parameter to ES nodejs client like this:

schema.statics.search = function(query, options, cb){
    if (arguments.length === 2) {
      cb = arguments[1]
      options = {}
    }

    options.hydrateOptions = options.hydrateOptions || defaultHydrateOptions || {};

    if (query === null)
      query = undefined

    var model = this
      , esQuery = {
        body: {
          query: query
        },
        index: options.index || indexName,
        type:  options.type  || typeName
      }
     if (options.highlight) {
        esQuery.body.highlight = options.highlight;
     }
 .......

So my question is how I can get the stemming working?

i would not recommend using a plugin on top of another plugin.

Also imo elasticsearch should not be used as a database, but more like an indexing service.

Give the original low-level package a try, its easy to learn and works fine.

https://www.npmjs.com/package/elasticsearch