DemeCarvO
DemeCarvO

Reputation: 507

illegal_argument_exception request contains unrecognized parameter: [mapping] - ElasticSearch Index Creation

I have been using elasticsearch for the first time since yesterday and I am struggling to get simple functionalities up and running after two days working on it in reason of my limited knowledge.

My main goal is to accomplish a crud with Node.js + ElasticSearch. Now I am stuck to create an index by using mapping feature.

My straight question is: what I have to do in order to make this code works?

return client.indices.create({
    index: 'index_created_with_map',
    mapping: {
        posts: {
            user: {
                type: 'string'
            },
            post_date: {
                type: 'string'
            },
            message: {
                type: 'string'
            }
        }
    }
});

Any suggestion what to check will be appreciated.

Plus that, although not part of my main question, any comment how to return properly the get and search function to response.send(JSON.stringify(the data from elasticsearch)) and how to map post_date to date type instead of string will be appreciated as I am stuck on it as well.

Bellow is all I have tried so far. I can see throw "Chrome ElastiSearch ToolBox extension" when I try without mapping feature like in addToIndex below it does work but I would like to have separate functions, one for create the index which I will run just once obviously and another for creating the "record" which will be part of my crud.

PS. I found very similar question here without any answer

illegal_argument_exception: no mapping found for field

error log:

Unhandled rejection Error: [illegal_argument_exception] request [/index_created_with_map] contains unrecognized parameter: [mapping]
    at respond (/home/demetrio/dev/WSs/NodeJs/greencard-dmz-es-oracle/node_modules/elasticsearch/src/lib/transport.js:289:15)
    at checkRespForFailure (/home/demetrio/dev/WSs/NodeJs/greencard-dmz-es-oracle/node_modules/elasticsearch/src/lib/transport.js:248:7)
    at HttpConnector.<anonymous> (/home/demetrio/dev/WSs/NodeJs/greencard-dmz-es-oracle/node_modules/elasticsearch/src/lib/connectors/http.js:164:7)
    at IncomingMessage.wrapper (/home/demetrio/dev/WSs/NodeJs/greencard-dmz-es-oracle/node_modules/lodash/lodash.js:4968:19)
    at emitNone (events.js:72:20)
    at IncomingMessage.emit (events.js:166:7)
    at endReadableNT (_stream_readable.js:905:12)
    at nextTickCallbackWith2Args (node.js:441:9)
    at process._tickCallback (node.js:355:17)

My controller NodeJs

var elasticsearch = require('elasticsearch');
var Promise = require('bluebird');

exports.teste = function (req, res) {

    var log = console.log.bind(console);

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

    function createIndexWithMapping() {
        return client.indices.create({
            index: 'index_created_with_map',
            mapping: {
                posts: {
                    user: {
                        type: 'string'
                    },
                    post_date: {
                        type: 'string'
                    },
                    message: {
                        type: 'string'
                    }
                }
            }
        });
    }

    function createIndexWithoutMapping() {
        return client.create({
            index: 'index_created_without_map',
            type: 'posts',
            id: '1',
            body: {
                user: 'me',
                post_date: new Date(),
                message: 'Hello World!'
            },
            refresh: true
        });
    }

    function addToIndex() {
        return client.index({
            index: 'index_created_...according to the test',
            type: 'posts',
            id: '1',
            body: {
                user: 'me2',
                post_date: new Date(),
                message: 'Hello World!2'
            },
            refresh: true
        });
    }

    function search() {
        return client.search({
            index: 'index_created_...according to the test',
            type: 'posts',
            body: {
                query: {
                    match: {
                        body: 'Hello'
                    }
                }
            }
        }).then(log);
    }

    function getFromIndex() {
        return client.get({
            index: 'index_created_...according to the test',
            type: 'posts',
            id: 1
        }).then(log);
    }


    function closeConnection() {
        client.close();
    }

    Promise.resolve()
        .then(createIndexWithMapping)
        //.then(createIndexWithoutMapping)
        //      .then(addToIndex)
        //    .then(search)
        //  .then(getFromIndex)
        .then(closeConnection);

    return res.send("a");

};

package.json

{
  "name": "my-first-elasticsearch-app",
  "main": "server.js",
  "dependencies": {
    "bcrypt-nodejs": "0.0.3",
    "body-parser": "^1.0.2",
    "ejs": "^1.0.0",
    "elasticsearch": "^12.1.3",
    "express": "^4.1.1",
    "express-session": "^1.6.1",
    "mongoose": "^3.8.8",
    "node-rest-client": "^2.5.0",
    "oauth2orize": "^1.0.1",
    "passport": "^0.2.0",
    "passport-http": "^0.2.2",
    "passport-http-bearer": "^1.0.1",
    "reqclient": "^2.1.0"
  }
}

Upvotes: 2

Views: 10140

Answers (2)

Ashish Gupta
Ashish Gupta

Reputation: 1241

Generic Parameters

body

Anything — The body to send along with this request. If the body is a string it will be passed along as is, otherwise, it is passed to the serializer and converted to either JSON or a newline separated list of JSON objects based on the API method.

Don't forget to add "body" before declaring "mappings"

Example:

    function createIndices() {
        return client.indices.create({
          index: "indicesName",
          body: {
            mappings: {
              text: {
                properties: {
                  id: {
                    type: "integer"
                  },
                  label: {
                    type: "keyword"
                  },
                  state: {
                    type: "keyword"
                  },
                  startTime: {
                    type: "date",
                    format: "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm:ss.SSS||yyyy-MM-dd'T'HH:mm:ssZZ"
                  },
                  updateTime: {
                    type: "date",
                    format: "yyyy-MM-dd HH:mm:ss||yyyy-MM-dd HH:mm:ss.SSS||yyyy-MM-dd'T'HH:mm:ssZZ"
                  }
                }
              }
            }
          }
        });
      }

Output:

  {
      "acknowledged": true,
      "shards_acknowledged": true,
      "index": "indicesName"
  }

Upvotes: 2

Mouneer
Mouneer

Reputation: 13489

According to elasticsearch.js » 5.5 API Doc

client.indices.create([params, [callback]])

Params

  • body

Object, JSON — An optional request body, as either JSON or a JSON serializable object. See the elasticsearch docs for details about what can be specified here.

And According to the API Convension doc

Generic Parameters

  • body

String, Anything — The body to send along with this request. If the body is a string it will be passed along as is, otherwise it is passed to the serializer and converted to either JSON or a newline separated list of JSON objects based on the API method.

So you should send mapping property as a request body inside the body property

A working example:

const es = require('elasticsearch');

const elasticsearchClient = new es.Client({
    host: 'localhost:9200',
    log: 'trace',
});

elasticsearchClient.indices.create({
    index: `index_created_with_map`,
    body: {
        mappings: {
            type_name: {
                // ...
            },
        },
    }
});

Upvotes: 1

Related Questions