org.apache.http.ContentTooLongException: съдържанието на обекта е твърде дълго [105539255] за конфигурирания лимит на буфера [104857600]

Опитвам се да извлека индексираните PDF документи от моя индекс (ElasticSearch). Индексирах моите pdf документи с помощта на приставката за обработка на прикачени файлове. Общо неговите 2500 документа са индексирани заедно с PDF прикачен файл.

Сега извличам тези PDF файлове, като търся със съдържанието на PDF и получавам грешката по-долу.

org.apache.http.ContentTooLongException: entity content is too long [105539255] for the configured buffer limit [104857600]
    at org.elasticsearch.client.HeapBufferedAsyncResponseConsumer.onEntityEnclosed(HeapBufferedAsyncResponseConsumer.java:76)
    at org.apache.http.nio.protocol.AbstractAsyncResponseConsumer.responseReceived(AbstractAsyncResponseConsumer.java:131)
    at org.apache.http.impl.nio.client.MainClientExec.responseReceived(MainClientExec.java:315)
    at org.apache.http.impl.nio.client.DefaultClientExchangeHandlerImpl.responseReceived(DefaultClientExchangeHandlerImpl.java:147)
    at org.apache.http.nio.protocol.HttpAsyncRequestExecutor.responseReceived(HttpAsyncRequestExecutor.java:303)
    at org.apache.http.impl.nio.DefaultNHttpClientConnection.consumeInput(DefaultNHttpClientConnection.java:255)
    at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:81)
    at org.apache.http.impl.nio.client.InternalIODispatch.onInputReady(InternalIODispatch.java:39)
    at org.apache.http.impl.nio.reactor.AbstractIODispatch.inputReady(AbstractIODispatch.java:114)
    at org.apache.http.impl.nio.reactor.BaseIOReactor.readable(BaseIOReactor.java:162)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvent(AbstractIOReactor.java:337)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.processEvents(AbstractIOReactor.java:315)
    at org.apache.http.impl.nio.reactor.AbstractIOReactor.execute(AbstractIOReactor.java:276)
    at org.apache.http.impl.nio.reactor.BaseIOReactor.execute(BaseIOReactor.java:104)
    at org.apache.http.impl.nio.reactor.AbstractMultiworkerIOReactor$Worker.run(AbstractMultiworkerIOReactor.java:588)
    at java.lang.Thread.run(Thread.java:748)
Exception in thread "main" java.lang.NullPointerException
    at com.es.utility.DocumentSearch.main(DocumentSearch.java:88)

Моля, намерете моя Java API код за извличане на документи от ElasticSearch

private final static String ATTACHMENT = "document_attachment";
private final static String TYPE = "doc";

public static void main(String args[])
{
    RestHighLevelClient restHighLevelClient = null;

    try {
        restHighLevelClient = new RestHighLevelClient(RestClient.builder(new HttpHost("localhost", 9200, "http"),
                new HttpHost("localhost", 9201, "http")));

    } catch (Exception e) {
        System.out.println(e.getMessage());
    }



    SearchRequest contentSearchRequest = new SearchRequest(ATTACHMENT); 
    SearchSourceBuilder contentSearchSourceBuilder = new SearchSourceBuilder();
    contentSearchRequest.types(TYPE);
    QueryBuilder attachmentQB = QueryBuilders.matchQuery("attachment.content", "activa");
    contentSearchSourceBuilder.query(attachmentQB);
    contentSearchSourceBuilder.size(50);
    contentSearchRequest.source(contentSearchSourceBuilder);
    SearchResponse contentSearchResponse = null;
    System.out.println("Request --->"+contentSearchRequest.toString());
    try {
        contentSearchResponse = restHighLevelClient.search(contentSearchRequest);
    } catch (IOException e) {
        e.getLocalizedMessage();
    }

    try {
        System.out.println("Response --->"+restHighLevelClient.search(contentSearchRequest)); // am printing the mentioned error from this line.
    } catch (IOException e) {
        e.printStackTrace();
    }
    SearchHit[] contentSearchHits = contentSearchResponse.getHits().getHits();
    long contenttotalHits=contentSearchResponse.getHits().totalHits;
    System.out.println("condition Total Hits --->"+contenttotalHits);

Използвам ElasticSearch версия 6.2.3


person Karthikeyan    schedule 25.06.2018    source източник


Отговори (1)


Трябва да увеличите http.max_content_length във вашия elasticsearch.yml конфигурационен файл.

По подразбиране той е зададен на 100MB (100*1024*1024 = 104857600), така че вероятно трябва да го зададете малко по-високо от това.

АКТУАЛИЗАЦИЯ

Всъщност това е различен проблем, който е обяснен тук. По принцип HttpAsyncResponseConsumerFactory по подразбиране буферира цялото тяло на отговора в хийп паметта, но само до 100mb по подразбиране. Заобиколното решение е да конфигурирате друг размер за този буфер, но единствената ви възможност е вместо това да работите с REST клиента на ниско ниво. В ES 7 ще можете да направите това на REST клиента на високо ниво, като използвате клас, наречен RequestOptions, но той все още не е пуснат.

long BUFFER_SIZE = 120 * 1024 * 1024;     <---- set buffer to 120MB instead of 100MB
Map<String, String> params = Collections.emptyMap();
HttpEntity entity = new NStringEntity(contentSearchSourceBuilder.toString(), ContentType.APPLICATION_JSON);
HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory consumerFactory =
        new HttpAsyncResponseConsumerFactory.HeapBufferedResponseConsumerFactory(BUFFER_SIZE);
Response response = restClient.performRequest("GET", "/document_attachment/doc/_search", params, entity, consumerFactory); 
person Val    schedule 25.06.2018
comment
Направих тази промяна във elasticsearch.yml файл http.max_content_length: 200mb, след което рестартирах elasticsearch чрез services.msc., но все още получавам същото съобщение за грешка. Трябва ли да правя нещо друго? - person Karthikeyan; 25.06.2018
comment
Този запис не е наличен в elasticsearch.yml файл. Добавих този ред http.max_content_length: 200MB ръчно в края на файла. (като последен ред). Въпреки че не работи. - person Karthikeyan; 25.06.2018
comment
Имате ли някаква идея., как да конфигурирате http.max_content_length: 200mb от elasticsearch.yml файлът не работи за ES версия 6.2.3 - person Karthikeyan; 25.06.2018
comment
Всъщност това е друг въпрос, разглеждам го. - person Val; 25.06.2018
comment
Имаме ли някаква работа по този проблем., В момента използвам RestHighLevelClient, имаме ли друг клиент за комуникация. - person Karthikeyan; 26.06.2018
comment
мога да формулирам заявка с помощта на RestClient благодаря за помощта. Но не получавам отговор или очакван отговор. Повдигнах като отделен въпрос за това. stackoverflow.com/questions/51039930/ - person Karthikeyan; 26.06.2018