我正在将Elasticsearch集成到应用程序中,并且看起来我发送的请求的大小受到限制。大小不能超过10MB。为300多个Java对象构建JSON请求主体超出了所提供的限制。我认为我可以处理2种情况:
情况1:在构建请求正文时,请继续检查其大小,并在达到限制时立即发送请求。(我认为这样做更有意义)
案例2:构建整个JSON请求,将其分成10MB的大块并发送请求。
有人可以帮我把这个请求切成10MB的大块吗? 另外,请记住,部分请求可能会渗入块中。
我已经看过这篇SO帖子: How to cut a String into 1 megabyte subString with Java?
只是想知道这是否仍然是将字符串分割成固定块大小的最佳方法,还是有更好的方法。
谢谢。
[UPDATE 02/14 4:45 pm] 所以我想出了这段代码。这似乎至少没有导致弹出“请求大小超过10485760字节”错误。我看到数据现在已成功建立索引。非常感谢对此代码的任何反馈。
// Convert the entityList to JSON
long remainingChunkSize = 10000000; // 10MB size limit (not exact but this is ok)
StringBuilder sb = new StringBuilder(1024);
List<String> reqChunkList = new ArrayList<String>();
Gson gson = new Gson();
boolean addChunkToList = false;
for (EntityData entity : entityDataList) {
indexName = (entity.getSearchable().get("search_entity")).toLowerCase();
String chunk = String.format("{ \"index\" : { \"_index\" : \"%s\", \"_type\" : \"%s\", \"_id\" : \"%s\" } }\n%s\n",
indexName, "_doc", "mojo", gson.toJson(entity.getSearchable()));
byte[] b = chunk.getBytes(StandardCharsets.UTF_8); // get the bytes
long byteLength = b.length;
if (byteLength < remainingChunkSize) {
sb.append(chunk);
remainingChunkSize -= byteLength;
addChunkToList = true;
} else {
remainingChunkSize = 10000000;
reqChunkList.add(sb.toString());
sb = new StringBuilder(1024);
sb.append(chunk);
addChunkToList = true;
remainingChunkSize -= byteLength;
}
}
if (addChunkToList) { // The last chunk
reqChunkList.add(sb.toString());
}