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:jestet l’injectino deJestClient. - 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.