es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

Spring Data Elasticsearch 4 inserta por lotes consultas diferentes en índices diferentes.

En la versión 3.x se puede especificar el nombre del índice como parte de la consulta, pero en la versión 4 está escrito “Eliminación del nombre implícito de índice en los objetos de consulta” (por lo tanto, no hay withIndexName)…

¿Cómo puedo insertar varias consultas en diferentes índices en el mismo bloque de inserción, aparte de usar directamente el RestHighLevelClient?

Tags:  ,

Answer

  1. Avatar for davy.ai

    Una forma de insertar múltiples consultas en diferentes índices en el mismo bloque sin utilizar directamente el RestHighLevelClient es utilizando el BulkProcessor proporcionado por el Elasticsearch Java High-Level REST Client.

    Primero, crea una instancia de BulkProcessor proporcionando el RestHighLevelClient y una implementación de BulkProcessor.Listener que maneje la respuesta después de cada ejecución de bloque. Luego, utiliza el método BulkProcessor.add() para agregar cada consulta como un objeto de BulkRequest con el nombre de índice deseado.

    Aquí tienes un ejemplo:

    RestHighLevelClient client = new RestHighLevelClient(
        RestClient.builder(new HttpHost("localhost", 9200, "http")));
    
    BulkProcessor.Listener listener = new BulkProcessor.Listener() {
        @Override
        public void beforeBulk(long executionId, BulkRequest request) {
            // opcionalmente hace algo antes de la ejecución en bloque
        }
    
        @Override
        public void afterBulk(long executionId, BulkRequest request, BulkResponse response) {
            // gestiona la respuesta después de la ejecución en bloque
        }
    
        @Override
        public void afterBulk(long executionId, BulkRequest request, Throwable failure) {
            // gestiona el fallo después de la ejecución en bloque
        }
    };
    
    BulkProcessor bulkProcessor = BulkProcessor.builder(client::bulkAsync, listener)
        .setBulkActions(1000)
        .setBulkSize(new ByteSizeValue(5L, ByteSizeUnit.MB))
        .setFlushInterval(TimeValue.timeValueSeconds(5L))
        .build();
    
    BulkRequest request1 = new BulkRequest("index1");
    request1.add(new IndexRequest().source("field1", "value1"));
    
    BulkRequest request2 = new BulkRequest("index2");
    request2.add(new IndexRequest().source("field2", "value2"));
    
    bulkProcessor.add(request1);
    bulkProcessor.add(request2);
    
    bulkProcessor.close();
    

    En este ejemplo, creamos una instancia de RestHighLevelClient y una implementación de BulkProcessor.Listener que registra la respuesta y el fallo después de cada ejecución de bloque.

    Luego, creamos una instancia de BulkProcessor utilizando el método BulkProcessor.builder(), proporcionando la referencia al método client::bulkAsync y el listener. También configuramos algunos parámetros para la ejecución del bloque, como el número máximo de acciones en cada bloque, el tamaño máximo de cada bloque y el intervalo de vaciado.

    A continuación, creamos dos instancias de BulkRequest, una para cada índice. Agregamos un objeto IndexRequest a cada solicitud en bloque con el campo y valor deseado.

    Finalmente, agregamos cada solicitud en bloque al BulkProcessor utilizando el método add(). Cuando hayamos terminado de agregar todas las solicitudes en bloque, cerramos el BulkProcessor.

    De esta manera, todas las consultas se ejecutarán en el mismo bloque, pero cada una se dirigirá al nombre de índice deseado.

Comments are closed.