elasticsearch,amazon-dynamodb,amazon-dynamodb-streams,Java,Amazon Web Services,elasticsearch,Amazon Dynamodb,Amazon Dynamodb Streams" /> elasticsearch,amazon-dynamodb,amazon-dynamodb-streams,Java,Amazon Web Services,elasticsearch,Amazon Dynamodb,Amazon Dynamodb Streams" />

Java 使用AWS SDK v2从DynamoDB到Elasticsearch?

Java 使用AWS SDK v2从DynamoDB到Elasticsearch?,java,amazon-web-services,elasticsearch,amazon-dynamodb,amazon-dynamodb-streams,Java,Amazon Web Services,elasticsearch,Amazon Dynamodb,Amazon Dynamodb Streams,我遇到了,展示了如何将数据从DynamoDB推送到Elasticsearch,以进行全文搜索索引。然而,我们的应用程序并没有使用Lambdas。相反,我们使用ApacheCamel来捕获DynamoDB Streams事件,并希望从那里将记录推送到Elasticsearch 因为我们使用的是AWS SDK v2,所以我们没有捕获包含DynamoDB记录的DynamodbEvent类或相应的DynamodbStreamRecord记录类。相反,我们收到的是一个software.amazon.aws

我遇到了,展示了如何将数据从DynamoDB推送到Elasticsearch,以进行全文搜索索引。然而,我们的应用程序并没有使用Lambdas。相反,我们使用ApacheCamel来捕获DynamoDB Streams事件,并希望从那里将记录推送到Elasticsearch

因为我们使用的是AWS SDK v2,所以我们没有捕获包含DynamoDB记录的
DynamodbEvent
类或相应的
DynamodbStreamRecord
记录类。相反,我们收到的是一个
software.amazon.awssdk.services.dynamodb.model.Record
对象。鉴于此,我们如何在Elasticsearch中序列化并随后索引这些数据?在引用的另一个问题中,记录被转换为JSON字符串,然后发送到Elasticsearch。v2
Record
类有没有办法做到这一点?答案中提到的
ItemUtils
类已经不存在了,所以我不知道还有另一种序列化方法


非常感谢您能给予的任何帮助

与您提供的示例类似,您可以尝试以下操作:

public void processRecord(记录记录记录、字符串索引、字符串类型、RestHighLevelClient esClient)引发异常{
//动手术
final OperationType OperationType=record.eventName();
//获取对实际DynamoDB流记录的引用
最终StreamRecord StreamRecord=record.dynamodb();
//获取ID。假定单个数字属性作为分区键
最终映射键=streamRecord.keys();
最终字符串recordId=keys.get(“ID”).n();
开关(操作型){
案例插页:
如果(!streamRecord.hasNewImage()){
抛出新的IllegalArgumentException(“插入时没有新图像”);
}
Map newImage=streamRecord.newImage();
//这里定义了toJsonhttps://github.com/aaronanderson/aws-java-sdk-v2-utils/blob/master/src/main/java/DynamoDBUtil.java
//并包括在下面
JsonObject JsonObject=toJson(newImage);
IndexRequest IndexRequest=新的IndexRequest(索引、类型、记录ID);
source(jsonObject.toString(),XContentType.JSON);
IndexResponse IndexResponse=esClient.index(indexRequest,RequestOptions.DEFAULT);
System.out.println(“新内容成功索引:+indexResponse”);
打破
案例修改:
如果(!streamRecord.hasNewImage()){
抛出新的IllegalArgumentException(“更新时没有新图像”);
}
Map newImage=streamRecord.newImage();
JsonObject JsonObject=toJson(newImage);
UpdateRequest UpdateRequest=新的UpdateRequest(索引、类型、记录ID);
doc(jsonObject.toString(),XContentType.JSON);
UpdateResponse UpdateResponse=esClient.update(updateRequest,RequestOptions.DEFAULT);
System.out.println(“内容成功更新:+updateResponse”);
打破
案例移除:
DeleteRequest DeleteRequest=新的DeleteRequest(索引、类型、记录ID);
DeleteResponse DeleteResponse=esClient.delete(deleteRequest,RequestOptions.DEFAULT);
System.out.println(“成功删除:+deleteResponse”);
打破
违约:
抛出新的UnsupportedOperationException(“操作类型”+OperationType+“不支持”);
}
}
定义的
toJson
方法为此类:

源代码在此复制:

import java.io.ByteArrayInputStream;
导入java.io.ByteArrayOutputStream;
导入java.io.IOException;
导入java.math.BigDecimal;
导入java.util.HashMap;
导入java.util.LinkedList;
导入java.util.List;
导入java.util.Map;
导入java.util.zip.DataFormatException;
导入java.util.zip.Deflater;
导入java.util.zip.Inflater;
导入javax.json.json;
导入javax.json.JsonArray;
导入javax.json.JsonArrayBuilder;
导入javax.json.JsonNumber;
导入javax.json.JsonObject;
导入javax.json.JsonObjectBuilder;
导入javax.json.JsonString;
导入javax.json.JsonStructure;
导入javax.json.JsonValue;
导入software.amazon.awssdk.core.SdkBytes;
导入software.amazon.awssdk.services.dynamodb.model.AttributeValue;
/**这是一个用于将DynamoDB AttributeValue转换为Java JSON-P对象或从Java JSON-P对象转换为DynamoDB AttributeValue的实用程序*/
公共类发电机{
公共静态void addList(字符串键、JsonObjectBuilder objectBuilder、列表项){
如果(!items.isEmpty()){
JsonArrayBuilder=Json.createArrayBuilder();
items.forEach(i->builder.add(i));
add(key,builder.build());
}
}
公共静态JsonArray toJson(列表


如果你喜欢使用Jackson的AtributeValue序列化库进行JSON序列化,这篇文章也为你提供了一个链接。

这很有魅力!DynamoDbUtil片段确实是我错过的一个片段。我不知道我怎么会不知道!很棒的@Shadowman!!我同意你的观点,所有的功劳都归于类
DynamoDbUtil
。我很高兴听到答案很有用!!