Intégration d’Elasticsearch dans une application Spring Boot

Pour démarrer une instance Elasticsearch en local via Docker avec des contraintes mémoire réduites, exécutez la commande suivante :

docker run -e ES_JAVA_OPTS="-Xms256m -Xmx256m" -d -p 9201:9200 -p 9301:9300 --name es-node-2 752be83a5396

Une fois lancée, l’interface Kibana ou les requêtes REST peuvent être testées via un navigateur sur http://localhost:9201. Les opérations CRUD standards s’effectuent via les verbes HTTP : GET pour récupérer un document, DELETE pour le supprimer, HEAD pour vérifier sa présence, et PUT pour l’insérer ou le mettre à jour (idempotent).

Spring Boot propose deux approches natives pour interagir avec Elasticsearch :

  • Jest Client — une bibliothèque légère basée sur HTTP, non activée par défaut. Elle nécessite l’ajout epxlicite de la dépendance io.searchbox:jest et l’injectino de JestClient.
  • Spring Data Elasticsearch — une abstraction reposant sur le transport client (TCP), sensible aux versions. Une incompatibilité fréquente survient entre les versions de Spring Boot, Spring Data Elasticsearch et Elasticsearch elle-même. La matrice officielle de compatibilité est disponible sur le dépôt GitHub du projet.

Pour configurer Jest dans une application Spring Boot, ajoutez les propriétés suivantes dans application.yml :

spring:
  elasticsearch:
    jest:
      uris: http://192.168.0.106:9200
      read-timeout: 10000
      multi-threaded: true

Définissez une entité indexable avec annotation @JestId :

public class BlogPost {
    @JestId
    private Long postId;
    private String writer;
    private String headline;
    private String body;
    
    // Constructeurs, getters et setters omis pour concision
}

Dans un test unitaire, vous pouvez indexer un document comme suit :

@RunWith(SpringRunner.class)
@SpringBootTest
class ElasticsearchIntegrationTest {

    @Autowired
    private JestClient client;

    @Test
    void shouldIndexDocument() throws IOException {
        BlogPost post = new BlogPost();
        post.setPostId(101L);
        post.setWriter("alice");
        post.setHeadline("Nouvelle fonctionnalité publiée");
        post.setBody("La mise à jour inclut un moteur de recherche amélioré.");

        IndexRequest request = new Index.Builder(post)
                .index("blog-index")
                .type("article")
                .build();

        JestResult result = client.execute(request);
        assertTrue(result.isSucceeded());
    }

    @Test
    void shouldSearchByContent() throws IOException {
        String queryJson = """
            {
              "query": {
                "match_phrase": {
                  "body": "moteur de recherche"
                }
              }
            }
            """;

        Search search = new Search.Builder(queryJson)
                .addIndex("blog-index")
                .addType("article")
                .build();

        SearchResult response = client.execute(search);
        assertNotNull(response.getJsonObject());
        assertTrue(response.getTotal() > 0);
    }
}

Ces exemples illustrent une intégration basée sur Jest, évitant les problèmes de version liés au client de transport obsolète utilisé par certaines anciennes versions de Spring Data Elasticsearch.

Étiquettes: Elasticsearch spring-boot jest-client spring-data-elasticsearch Docker

Publié le 24 août à 22h24