【发布时间】:2017-12-17 22:02:48
【问题描述】:
我正在将 DynamoDB 行推送到 Elasticsearch 集群中。日期字段是 unix 时间戳,Kibana 不会将其识别为日期。
我阅读了Elasticsearch mapping types 并找到了this post,但不知道在我的 Lambda 脚本中的何处实现映射:
/* ... requires and config ... */
exports.handler = (event, context, callback) => {
event.Records.forEach((record) => {
var dbRecord = JSON.stringify(record.dynamodb);
postToES(dbRecord, context, callback);
});
};
function postToES(doc, context, lambdaCallback) {
var req = new AWS.HttpRequest(endpoint);
req.method = 'POST';
req.path = path.join('/', esDomain.index, esDomain.doctype);
req.region = esDomain.region;
req.headers['presigned-expires'] = false;
req.headers['Host'] = endpoint.host;
req.body = doc;
// Maybe here?
var signer = new AWS.Signers.V4(req , 'es');
signer.addAuthorization(creds, new Date());
var send = new AWS.NodeHttpClient();
send.handleRequest(req, null, function(httpResp) {
var respBody = '';
httpResp.on('data', function (chunk) {
respBody += chunk;
});
httpResp.on('end', function (chunk) {
lambdaCallback(null,'Lambda added document ' + doc);
});
}, function(err) {
console.log('Error: ' + err);
lambdaCallback('Lambda failed with error ' + err);
});
}
Elasticsearch 文档
{
_index: "posts",
_type: "post",
_id: "6YKF2AAV06RSSRrzv6R-",
_version: 1,
found: true,
_source: {
ApproximateCreationDateTime: 1499922960,
Keys: {
id: {
S: "7asda8b0-628a-11e7-9e5e-25xyc7179dx7"
}
},
NewImage: {
posted_at: {
N: "1499922995401"
},
id: {
S: "7asda8b0-628a-11e7-9e5e-25xyc7179dx7"
}
},
SequenceNumber: "2442423900000000003279639454",
SizeBytes: 221,
StreamViewType: "NEW_AND_OLD_IMAGES"
}
}
Dynamoose 架构
var Schema = dynamoose.Schema;
var s = new Schema({
id: {
type: String,
hashKey: true,
required: true
},
posted_at: {
type: Date,
required: true
}
});
module.exports = dynamoose.model('posts', s);
示例:在我的 DynamoDB 表中,我有字段 posted_at。内容是一个 Unix 时间戳。在 Kiabana 中,它的索引为
-
NewImage.posted_at.N(类型:字符串,可搜索,已分析) 和 -
NewImage.posted_at.N.keyword(类型:字符串,可搜索,可聚合)
我对@987654329@ 和type: string 感到困惑。
有什么想法吗? 谢谢!
【问题讨论】:
-
你能展示一下 ES 为你创建的映射吗?
-
谢谢。你也可以展示一个示例文档吗?
-
不,我需要一个已被 ES 索引的文档,而不是来自 DynamoDB 的文档
-
知道为什么
{ "posted_at": 1498794511820 }会变成{ "posted_at": {"N": "1498794511820"} }吗? -
您介意分享您的 Dynamoose 代码吗?
标签: javascript amazon-web-services elasticsearch amazon-dynamodb kibana