Dec 4th, 2017: [FR][Elasticsearch] Advanced REST Java Client

Aujourd'hui, nous allons vous montrer en quelques lignes comment utiliser le client Java REST d'Elasticsearch.

La première chose à faire est d'importer le client dans votre projet :

<dependency>
    <groupId>org.elasticsearch.client</groupId>
    <artifactId>elasticsearch-rest-high-level-client</artifactId>
    <version>6.0.0</version>
</dependency>

Supposons que vous ayez une instance d'Elasticsearch démarrée localement et s'exécutant sur http://localhost:9200. Vous devez initialiser le client comme suit :

RestHighLevelClient client = new RestHighLevelClient(
                RestClient.builder(HttpHost.create("http://127.0.0.1:9200")));

Pour indexer des documents, vous devez en fournir une version JSON. Par exemple, avec la librairie Jackson, vous pouvez transformer votre objet ainsi :

byte[] bytes = mapper.writeValueAsBytes(object);

Pour l'indexer, vous pouvez soit faire des opérations unitaires :

client.index(new IndexRequest("index", "doc").source(bytes, XContentType.JSON));

Soit utiliser l'API BULK, plus efficace pour un traitement par lot:

// Initialisation du Bulk Processor
BulkProcessor bulkProcessor = new BulkProcessor.Builder(client::bulkAsync, new BulkProcessor.Listener() {
    @Override public void beforeBulk(long executionId, BulkRequest request) { }
    @Override public void afterBulk(long executionId, BulkRequest request, BulkResponse response) { }
    @Override public void afterBulk(long executionId, BulkRequest request, Throwable failure) { }
}, new ThreadPool(Settings.builder().put(Node.NODE_NAME_SETTING.getKey(), "high-level-client").build()))
        .setBulkActions(10000)
        .setFlushInterval(TimeValue.timeValueSeconds(5))
        .build();

Les opérations d'indexation s'écrivent du coup ainsi :

bulkProcessor.add(new IndexRequest("index", "doc").source(bytes, XContentType.JSON));

La configuration du BulkProcessor est telle que tous les 10000 documents (.setBulkActions(10000)), le contenu du bulk processor sera envoyé à Elasticsearch en une seule requête. Si il y a moins de 10000 documents en attente, le bulk sera tout de même exécuté au bout de 5 secondes (.setFlushInterval(TimeValue.timeValueSeconds(5))).

Pour chercher vos documents, vous devez utiliser l'API search et utiliser l'une des requêtes exposées par la classe QueryBuilders :

// Construire une query
QueryBuilder query = QueryBuilders.matchAllQuery();

// Exécuter la recherche
SearchResponse response = client.search(new SearchRequest("index")
        .source(new SearchSourceBuilder()
                .query(query)
        ));

L'object response contient toutes les informations nécessaires, comme par exemple le nombre total de documents qui correspondent à votre requête response.getHits().getTotalHits(). Une version JSON de la réponse est disponible avec response.toString().

Pour plus d'informations, veuillez consulter la documentation du client Java REST.

N'oubliez pas le warning dans cette page : vous avez jusqu'à la v8 pour bien assimiler cet article. Ca fera sans doute encore 2 calendriers de l'Avent :slight_smile: