java - 将 Elasticsearch json 请求拆分为每个 10MB 大小的块
问题描述
我正在努力将 Elasticsearch 集成到应用程序中,看起来我发送的请求的大小受到限制。它的大小不能超过 10MB。为超过 300 个 java 对象构建 JSON 请求正文超出了提供的限制。我想我可以在两种情况下处理这个问题:
案例1:在构建请求体时不断检查请求体的大小,一旦达到限制,就发送请求。(我认为这更有意义)
案例 2:构建整个 JSON 请求,将其拆分为每个 10MB 的块并发送请求。
有人可以帮我把这个请求分成 10MB 的块吗?另外,请记住,部分请求可能会潜入块中。
我已经看过这个 SO 帖子: How to cut a String into 1 MB subString with Java?
只是想知道这是否仍然是将字符串拆分为固定块大小的最佳方法,还是有更好的方法。
谢谢。
[更新 02/14 下午 4:45] 所以我想出了这个代码。这似乎至少不会导致“请求大小超过 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());
}
解决方案
推荐阅读
- swift - IOBluetooth 通过沙盒访问阻止
- unit-testing - 测试使用 PHPUnit 插入数据后如何从数据库中删除?
- c - 使用 malloc 创建数组并将其作为函数传递
- ios - 我可以使用firebase在iOS上通过电话号码和密码登录用户吗
- python - 如何从 sphinx.ext.autosummary 的侧边栏中隐藏 TOC?
- android - Android Kotlin - 如何仅在应用打开时执行动画?
- powershell - 如何将警告捕获到日志
- spring - 当 Put 和 Post 请求的请求正文为空时,MockMvc 失败
- reactjs - 如何在对话框关闭时重置 Material UI 复选框
- prometheus - 如何使用 Prometheus 在 Grafana 中编写 OR 函数