Я работаю над интеграцией 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());
}