首页 > 解决方案 > 将 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());
        }

标签: javastringelasticsearchsize

解决方案


推荐阅读