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


(David Pilato) #1

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.


(jean-pierre paris) #2

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:


(Mark Walkom) closed #3