Reputation: 507
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
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
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