从昨天起我第一次使用elasticsearch,由于我的知识有限,经过两天的工作,我正在努力启动和运行简单的功能。
我的主要目标是使用 Node.js + ElasticSearch 完成任务。现在我不得不使用 mapping
功能创建索引。
我的直接问题是:我必须做什么才能使这段代码正常工作?
return client.indices.create({
index: 'index_created_with_map',
mapping: {
posts: {
user: {
type: 'string'
},
post_date: {
type: 'string'
},
message: {
type: 'string'
}
}
}
});
任何检查内容的建议将不胜感激。
此外,尽管不是我的主要问题的一部分,但任何评论如何正确地将获取和搜索功能返回到 response.send(JSON.stringify(the data from elasticsearch))
以及如何将 post_date
映射到日期类型而不是字符串将受到赞赏,因为我也陷入困境。
贝娄是我迄今为止所尝试过的。当我尝试不使用mapping
功能(如下面的addToIndex
)时,我可以看到抛出“Chrome ElastiSearch ToolBox扩展”,它确实可以工作,但我希望有单独的功能,一个用于创建显然我只会运行一次索引,另一个用于创建“记录”,这将成为我的 CRUD 的一部分。
illegal_argument_exception: no mapping found for field
错误日志:
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)
我的 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"
}
}
最佳答案
根据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.
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.
因此,您应该将 mapping
属性作为 body
属性内的请求正文发送
一个工作示例:
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: {
// ...
},
},
}
});
关于node.js - 非法参数异常请求包含无法识别的参数: [mapping] - ElasticSearch Index Creation,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/42308090/