Upgrade to Pro
— share decks privately, control downloads, hide ads and more …
Speaker Deck
Features
Speaker Deck
PRO
Sign in
Sign up for free
Search
Search
Next Level Elasticsearch Integration with Sprin...
Search
Peter-Josef Meisch
October 15, 2020
Programming
1
130
Next Level Elasticsearch Integration with Spring Data Elasticsearch
The slides for my session at ElasticON Global on October 14th and 15th 2020
Peter-Josef Meisch
October 15, 2020
Tweet
Share
Other Decks in Programming
See All in Programming
360° Signals in Angular: Signal Forms with SignalStore & Resources @ngLondon 01/2026
manfredsteyer
PRO
0
130
CSC307 Lecture 05
javiergs
PRO
0
500
今から始めるClaude Code超入門
448jp
8
9k
CSC307 Lecture 10
javiergs
PRO
1
660
AI Schema Enrichment for your Oracle AI Database
thatjeffsmith
0
310
要求定義・仕様記述・設計・検証の手引き - 理論から学ぶ明確で統一された成果物定義
orgachem
PRO
1
160
AI巻き込み型コードレビューのススメ
nealle
2
420
QAフローを最適化し、品質水準を満たしながらリリースまでの期間を最短化する #RSGT2026
shibayu36
2
4.4k
【卒業研究】会話ログ分析によるユーザーごとの関心に応じた話題提案手法
momok47
0
200
今こそ知るべき耐量子計算機暗号(PQC)入門 / PQC: What You Need to Know Now
mackey0225
3
380
責任感のあるCloudWatchアラームを設計しよう
akihisaikeda
3
180
開発者から情シスまで - 多様なユーザー層に届けるAPI提供戦略 / Postman API Night Okinawa 2026 Winter
tasshi
0
200
Featured
See All Featured
The Limits of Empathy - UXLibs8
cassininazir
1
220
Raft: Consensus for Rubyists
vanstee
141
7.3k
How Fast Is Fast Enough? [PerfNow 2025]
tammyeverts
3
450
Fight the Zombie Pattern Library - RWD Summit 2016
marcelosomers
234
17k
Keith and Marios Guide to Fast Websites
keithpitt
413
23k
Efficient Content Optimization with Google Search Console & Apps Script
katarinadahlin
PRO
1
330
How to audit for AI Accessibility on your Front & Back End
davetheseo
0
180
A Modern Web Designer's Workflow
chriscoyier
698
190k
SEO in 2025: How to Prepare for the Future of Search
ipullrank
3
3.3k
Visualizing Your Data: Incorporating Mongo into Loggly Infrastructure
mongodb
49
9.9k
Responsive Adventures: Dirty Tricks From The Dark Corners of Front-End
smashingmag
254
22k
Documentation Writing (for coders)
carmenintech
77
5.3k
Transcript
1 ElasticON Global Peter-Josef Meisch Spring Data Elasticsearch Project Lead
2 Nothing will stop you being creative more effectively as
the fear of making a mistake. John Cleese
3 Next Level Elasticsearch Integration with Spring Data Elasticsearch
What is Spring Data Elasticsearch?
“Spring Data’s mission is to provide a familiar and consistent,
Spring-based programming model for data access while still retaining the special traits of the underlying data store.”
Configure the connection to Elasticsearch
Configure the connection to Elasticsearch @Configuration public class RestClientConfig extends
AbstractElasticsearchConfiguration { @Override @Bean public RestHighLevelClient elasticsearchClient() { ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo("localhost:9200") .build(); return RestClients.create(clientConfiguration).rest(); } }
Configure the connection to Elasticsearch @Configuration public class RestClientConfig extends
AbstractElasticsearchConfiguration { @Override @Bean public RestHighLevelClient elasticsearchClient() { ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo("localhost:9200") .withProxy("localhost:8080") .build(); return RestClients.create(clientConfiguration).rest(); } }
Configure the connection to Elasticsearch @Configuration public class RestClientConfig extends
AbstractElasticsearchConfiguration { @Override @Bean public RestHighLevelClient elasticsearchClient() { ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo("localhost:9200") .usingSsl() .build(); return RestClients.create(clientConfiguration).rest(); } }
Configure the connection to Elasticsearch @Configuration public class RestClientConfig extends
AbstractElasticsearchConfiguration { @Override @Bean public RestHighLevelClient elasticsearchClient() { ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo("localhost:9200") .withBasicAuth("myuser", "mypassword") .build(); return RestClients.create(clientConfiguration).rest(); } }
Configure the connection to Elasticsearch @Configuration public class RestClientConfig extends
AbstractElasticsearchConfiguration { @Override @Bean public RestHighLevelClient elasticsearchClient() { ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo("localhost:9200") .withPathPrefix("customer1") .build(); return RestClients.create(clientConfiguration).rest(); } }
Configure the connection to Elasticsearch Supplier<HttpHeaders> currentTimeHeaders = () ->
{ HttpHeaders headers = new HttpHeaders(); headers.add("currentTime", LocalDateTime.now() .format(DateTimeFormatter.ISO_LOCAL_DATE_TIME)); return headers; }; ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo("localhost:9200") .withHeaders(currentTimeHeaders) .build();
Entity definition
Entity definition public class Person { @Id private String id;
private String lastName; private String firstName; private LocalDate birthDate; }
Entity definition @Document(indexName = "person") public class Person { @Id
private String id; private String lastName; private String firstName; private LocalDate birthDate; }
Entity definition @Document(indexName = "person") public class Person { @Id
private String id; @Field(type = FieldType.Text) private String lastName; @Field(type = FieldType.Text) private String firstName; private LocalDate birthDate; }
Entity definition @Document(indexName = "person") public class Person { @Id
private String id; @Field(type = FieldType.Text) private String lastName; @Field(type = FieldType.Text) private String firstName; @Field(type = FieldType.Date, format = DateFormat.basic_date) private LocalDate birthDate; }
ElasticsearchOperations
IndexOperations • index creation and deletion • index settings •
index mappings • index templates • alias management • refresh operation
IndexOperations private ElasticsearchOperations operations ; // injected by Spring IndexOperations
indexOps = operations.indexOps(Person.class); indexOps.create(); indexOps.putMapping(); PutTemplateRequest putTemplateRequest = PutTemplateRequest.builder("template-name", "log-*") .withSettings(settings) .withMappings(mapping) .withAliasActions(aliasActions) .build(); indexOps.putTemplate(putTemplateRequest);
IndexOperations private ElasticsearchOperations operations; // injected by Spring IndexOperations indexOps
= operations.indexOps(Person.class) ; indexOps.create(); indexOps.putMapping(); PutTemplateRequest putTemplateRequest = PutTemplateRequest.builder("template-name", "log-*") .withSettings(settings) .withMappings(mapping) .withAliasActions(aliasActions) .build(); indexOps.putTemplate(putTemplateRequest);
IndexOperations private ElasticsearchOperations operations; // injected by Spring IndexOperations indexOps
= operations.indexOps(Person.class); indexOps.create(); indexOps.putMapping(); PutTemplateRequest putTemplateRequest = PutTemplateRequest.builder("template-name", "log-*") .withSettings(settings) .withMappings(mapping) .withAliasActions(aliasActions) .build(); indexOps.putTemplate(putTemplateRequest);
IndexOperations private ElasticsearchOperations operations; // injected by Spring IndexOperations indexOps
= operations.indexOps(Person.class); indexOps.create(); indexOps.putMapping(); PutTemplateRequest putTemplateRequest = PutTemplateRequest.builder("template-name", "log-*") .withSettings(settings) .withMappings(mapping) .withAliasActions(aliasActions) .build(); indexOps.putTemplate(putTemplateRequest) ;
DocumentOperations • save • get • delete • exists •
update
SearchOperations • count • search Query based operations
NativeSearchQuery import static org.elasticsearch.index.query.QueryBuilders.*; import static org.elasticsearch.search.aggregations.AggregationBuilders.*; Query query =
new NativeSearchQueryBuilder() .addAggregation( terms("lastNames").field("lastName").size(10) ) .withQuery( matchQuery("firstName", firstName) ) .build(); SearchHits<Person> searchHits = operations.search(query, Person.class);
StringQuery Query query = new StringQuery( "{" + " \"bool\":
{" + " \"must\": [" + " {" + " \"match\": {" + " \"lastName\": \"Smith\"" + " }" + " }" + " ]" + " }" + "}"); SearchHits<Person> searchHits = operations.search(query, Person.class);
CriteriaQuery Criteria criteria = new Criteria("lastName").is("Smith") .and("firstName").is("James"); Query query =
new CriteriaQuery(criteria); SearchHits<Person> searchHits = operations.search(query, Person.class);
Return types
SearchHit<T • id • index name • the entity of
type T • score • sort values • highlight fields • inner hits
SearchHits<T • number of total hits • total hits relation
(eq, gte) • list of SearchHit<T> objects • max score • aggregations
ElasticsearchRepository
Repository interface PersonRepository extends ElasticsearchRepository< Person, String > { }
// ElasticsearchRepository // +PagingAndSortingRepository // + CrudRepository // + Repository
Repository count() delete(T) deleteAll() deleteAll(Iterable<? extends T) deleteById(ID) existsById(ID) findAll()
findAll(Pageable) findAll(Sort) findAllById(Iterable<ID>) findById(ID) save(T) saveAll(Iterable<T>) searchSimilar(T entity, String[] fields, Pageable pageable)
Repository methods interface PersonRepository extends ElasticsearchRepository< Person, String > {
List<Person> searchByFirstName(String name); List<Person> findByFirstNameOrderByLastNameAsc(String name); List<Person> queryByBirthDateBefore(LocalDate date); }
Repository methods interface PersonRepository extends ElasticsearchRepository<Person, String> { @Query(value =
"{\"fuzzy\":{\"lastName\":\"?0\"}}") List<Person> findByLastNameFuzzy(String lastName); }
Repository method return types interface PersonRepository extends ElasticsearchRepository<Person, String> {
List<Person> searchByFirstName(String name); }
Repository method return types interface PersonRepository extends ElasticsearchRepository<Person, String> {
Stream<Person> searchByFirstName(String name); }
Repository method return types interface PersonRepository extends ElasticsearchRepository<Person, String> {
List<SearchHit<Person>> searchByFirstName(String name); }
Repository method return types interface PersonRepository extends ElasticsearchRepository<Person, String> {
Stream<SearchHit<Person>> searchByFirstName(String name); }
Repository method return types interface PersonRepository extends ElasticsearchRepository<Person, String> {
SearchHits<Person> searchByFirstName(String name); }
Repository method return types interface PersonRepository extends ElasticsearchRepository<Person, String> {
SearchPage<Person> searchByFirstName(String name, Pageable page); }
Repository usage @RestController @RequestMapping(”/persons”) public class PersonController { private PersonRepository
repository; public PersonController(PersonRepository repository) { this.repository = repository; } @GetMapping(”/firstName/{name}”) List<Person> byFirstName( @PathVariable(”name”) String name) { return repository.searchByFirstName(name) ; } }
Repository method with highlight definition interface PersonRepository extends ElasticsearchRepository<Person, String>
{ @Highlight(fields = { @HighlightField(name = "firstName") }) SearchHits<Person> searchByFirstName(String name); } repository.searchByFirstName(”James”) .forEach(searchHit -> { List<String> highlights = searchHit.getHighlightField("firstName"); // ... });
What else?
Lifecycle events @Component public class PersonBeforeConvertCallback implements BeforeConvertCallback<Person> { @Override
public Person onBeforeConvert(Person person, IndexCoordinates indexCoordinates) { if (person.getId() == null) { person.setId(UUID.randomUUID().toString()); } return person; } }
Auditable Entity @Document(indexName = "person") public class Person implements Persistable<String>
{ @Id private String id; @CreatedDate @Field(type = FieldType.Date, format = DateFormat.basic_date_time) private Instant created; @CreatedBy private String createdBy; @Override public boolean isNew() { return id == null || (createdBy == null && created == null); } }
We need contributors! Spring Data Elasticsearch is a community-driven project
49 Thank You! https://spring.io/projects/spring-data-elasticsearch https://github.com/spring-projects/spring-data-elasticsearch @sothawo
[email protected]