首页 文章

如何格式化DynamoDB for Elasticsearch / Kibana的时间戳?

提问于
浏览
0

我正在将 DynamoDB 行推送到 Elasticsearch 集群中 . 日期字段为 unix timestampsKibana 无法将其识别为日期 .

我读了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 document

{
    _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 Schema

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 (类型:字符串,可搜索,可聚合)

我对 Ntype: string 感到困惑 .

有任何想法吗?谢谢!

1 回答

  • 1

    好吧事实证明 N 在那里表示DynamoDB attribute type(即 N 代表 Number ) .

    问题是数字被字符串化,因此索引为ES中的字符串(即您当前在映射中看到的字符串) .

    我们可以使用动态模板定义来解决这个问题 . 首先删除ES中的索引和Kibana中相应的索引模式 . 然后运行以下命令:

    curl -XPUT localhost:9200/_template/post_template -d '{
      "template": "posts",
      "mappings": {
        "post": {
          "dynamic_templates": [
            {
              "dates": {
                "path_match": "NewImage.posted_at.N",
                "mapping": {
                  "type": "date"
                }
              }
            },
            {
              "strings": {
                "match_mapping_type": "string",
                "mapping": {
                  "type": "text",
                  "fields": {
                    "raw": {
                      "type":  "keyword",
                      "ignore_above": 256
                    }
                  }
                }
              }
            }
          ]
        }
      }
    }'
    

    最后,您可以通过Dynamoose重新索引数据,然后您应该可以在Kibana中找到日期字段 .

相关问题