I'm trying to create an elasticsearch index with mappings using the official javascript client.
My code is as follows:
client.indices.create({
index: "aName",
"mappings": {
"aType": {
"properties": {
"aProp1": { "type": "string", "index": "not_analyzed" },
"aProp2": { "type": "string", "index": "not_analyzed" },
"aProp3": { "type": "string", "index": "not_analyzed" },
"aProp4": { "type": "string", "index": "not_analyzed" }
}
}
}
}, function(err,resp,respcode){
console.log(err,resp,respcode);
});
However... the index is created but without the mappings.... The output is:
undefined { ok: true, acknowledged: true } 200
What am I doing wrong?
To do this you will need your Elasticsearch endpoint address and your ApiKey. These can be accessed from your dashboard by choosing Stack Settings > Elasticsearch . The next step is to write a a curl -x get command to retrieve the mappings from Elasticsearch.
So it is recommended to save one mapping type into one index. From Elasticsearch version 6.0 by default index doesn't allow multiple types per index. The better option is to always have one document type per index. The single responsibility of the index is to maintain the single document type/mapping type per index.
Refining the answer that is in the comment above from Sander Spilleman. The "mappings" property needs to be inside the "body" property. I am also using the Javascript client 1.3.0 and the docs are still not updated with an example.
Adding an example that worked for me with the javascript API provided by elasticsearch on NPM 1.3.0
var body = { tweet:{ properties:{ tag : {"type" : "string", "index" : "not_analyzed"}, type : {"type" : "string", "index" : "not_analyzed"}, namespace : {"type" : "string", "index" : "not_analyzed"}, tid : {"type" : "string", "index" : "not_analyzed"} } } } client.indices.putMapping({index:"tweets", type:"tweet", body:body});
I tried same but got error from the name of index. aName is not valid, error was about the using lowercase index name. Then It created with mappings.
it.only('putMapping', function (done) { client.indices.create({ index: "aname", body: { "mappings": { "aType": { "properties": { "aProp1": {"type": "string", "index": "not_analyzed"}, "aProp2": {"type": "string", "index": "not_analyzed"}, "aProp3": {"type": "string", "index": "not_analyzed"}, "aProp4": {"type": "string", "index": "not_analyzed"} } } } } }, function (err, resp, respcode) { console.log(err, resp, respcode); }); })
Output:
Elasticsearch DEBUG: 2015-08-08T15:23:09Z starting request { method: 'POST', path: '/aname', body: { mappings: { aType: [Object] } }, query: {} } Elasticsearch TRACE: 2015-08-08T15:23:10Z -> POST http://localhost:9200/aname { "mappings": { "aType": { "properties": { "aProp1": { "type": "string", "index": "not_analyzed" }, "aProp2": { "type": "string", "index": "not_analyzed" }, "aProp3": { "type": "string", "index": "not_analyzed" }, "aProp4": { "type": "string", "index": "not_analyzed" } } } } } <- 200 { "acknowledged": true }
Just add body around mappings:
client.indices.create({
index: "aName",
body: {
"mappings": {
"aType": {
"properties": {
"aProp1": { "type": "string", "index": "not_analyzed" },
"aProp2": { "type": "string", "index": "not_analyzed" },
"aProp3": { "type": "string", "index": "not_analyzed" },
"aProp4": { "type": "string", "index": "not_analyzed" }
}
}
}
}
}, function (err, resp, respcode) {
console.log(err, resp, respcode);
});
If you love us? You can donate to us via Paypal or buy me a coffee so we can maintain and grow! Thank you!
Donate Us With