Разделите запрос ElasticSearch JSON на куски размером 10 МБ каждый - PullRequest
0 голосов
/ 14 февраля 2019

Я работаю над интеграцией Elasticsearch в приложение, и похоже, что существует ограничение на размер отправляемого запроса.Размер не может превышать 10 МБ.Построение тела запроса JSON для более 300 объектов Java превышает установленный лимит.Я думаю, что могу справиться с этим в 2 случаях:

Случай 1: Продолжайте проверять размер тела запроса, пока я его создаю, и как только он достигнет предела, отправьте запрос (я думаю, этоимеет смысл)

Случай 2. Создайте весь JSON-запрос, разбейте его на куски по 10 МБ каждый и отправьте запросы.

Может ли кто-нибудь помочь мне разделить этот запрос на куски по 10 МБ каждый?Кроме того, имейте в виду, что существует вероятность того, что частичный запрос может проникнуть в чанк.

Я уже посмотрел этот пост SO: Как разрезать строку в 1-мегабайтную подстроку с помощью 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());
        }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...