将Elasticsearch JSON请求拆分为每个10MB大小的块

时间:2019-02-13 22:49:44

标签: java string elasticsearch size

我正在将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());
        }

0 个答案:

没有答案