Elasticsearch SearchContextMissingException durante la consulta 'scan & scroll' con Spring Data Elasticsearch

Estoy usando elasticsearch 2.2.0 con la configuración predeterminada del clúster. Me encuentro con un problema con el escaneo y la consulta de desplazamiento usando spring data elasticsearch. Cuando ejecuto la consulta obtengo un error como este:

[2016-06-29 12:45:52,046][DEBUG][action.search.type       ] [Vector] [155597] Failed to execute query phase
RemoteTransportException[[Vector][10.132.47.95:9300][indices:data/read/search[phase/scan/scroll]]]; nested: SearchContextMissingException[No search context found for id [155597]];
Caused by: SearchContextMissingException[No search context found for id [155597]]
    at org.elasticsearch.search.SearchService.findContext(SearchService.java:611)
    at org.elasticsearch.search.SearchService.executeScan(SearchService.java:311)
    at org.elasticsearch.search.action.SearchServiceTransportAction$SearchScanScrollTransportHandler.messageReceived(SearchServiceTransportAction.java:433)
    at org.elasticsearch.search.action.SearchServiceTransportAction$SearchScanScrollTransportHandler.messageReceived(SearchServiceTransportAction.java:430)
    at org.elasticsearch.transport.TransportService$4.doRun(TransportService.java:350)
    at org.elasticsearch.common.util.concurrent.AbstractRunnable.run(AbstractRunnable.java:37)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1142)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:617)
    at java.lang.Thread.run(Thread.java:745)

Mi código de 'escaneo y desplazamiento':

public List<T> getAllElements(SearchQuery searchQuery) {
    searchQuery.setPageable(new PageRequest(0, PAGE_SIZE));
    String scrollId = elasticsearchTemplate.scan(searchQuery, 1000, false);
    List<T> allElements = new LinkedList<>();
    boolean hasRecords = true;
    while (hasRecords) {
        Page<T> page = elasticsearchTemplate.scroll(scrollId, 5000, resultMapper);
        if (page.hasContent()) {
            allElements.addAll(page.getContent());
        } else {
            hasRecords = false;
        }
    }
    elasticsearchTemplate.clearScroll(scrollId);
    return allElements;
}

Cuando el tamaño del resultado de mi consulta es menor que el parámetro PAGE_SIZE, un error como este ocurre cinco veces. Supongo que es uno por fragmento. Cuando el tamaño del resultado es mayor que PAGE_SIZE, el error ocurre varias veces más. Intenté refactorizar mi código para no llamar:

Page<T> page = elasticsearchTemplate.scroll(scrollId, 5000, resultMapper);

cuando estoy seguro de que la página no tiene contenido. Pero funciona solo si PAGE_SIZE es más grande que el resultado de la consulta, por lo que no es la solución en absoluto.

Tengo que agregar que es un problema solo en el lado de búsqueda elástica. En el lado del cliente, los errores están ocultos y en cada caso el resultado de la consulta es correcto. ¿Alguien sabe qué causa este problema?

Gracias por ayudar,

Simón.

Respuesta 1

Esto suele suceder si su contexto de búsqueda ya no está activo.

En su caso, está comenzando su exploración con un tiempo de espera de 1 segundo y luego cada exploración está activa durante 5 segundos. Probablemente sea demasiado bajo. La duración predeterminada para mantener vivo el contexto de búsqueda es de 1 minuto, por lo que probablemente debería aumentarlo a 60 segundos de esta manera:

String scrollId = elasticsearchTemplate.scan(searchQuery, 60000, false);
...
Page<T> page = elasticsearchTemplate.scroll(scrollId, 60000, resultMapper);
Respuesta: 2

Estoy bastante acostumbrado a bloquear mi servidor Tomcat. Pero no creo que haya hecho ningún cambio y parece que lo he roto por completo. Estaba trabajando un minuto y luego no el siguiente. Realmente espero que alguien pueda ayudar ...

¿Por qué Mockito se traga los rastros de la pila? Por ejemplo, si tengo una clase pública Foo {public void foo () {bar (); } public void bar () {baz (); } público ...

Tengo un pequeño problema con ejecutar mi aplicación de arranque de primavera en Docker. stack: maven 3+, spring boot (jpa / rest / jetty) - mysql - desplegar en docker Entonces, tengo en mi archivo pom <parent> <...

El nombre de mi paquete no contiene la estructura completa de mi carpeta. Por ejemplo, en IntelliJ he creado una clase de prueba: y su paquete se inicializó con package com; ¿Cómo configuro cuál es el ...