Bu yazımızda, Spring Data Elasticsearch’ün temellerini kod odaklı ve pratik yaparak öğreneceğiz.
Elasticsearch, modern uygulamaların arama, analiz ve gerçek zamanlı veri analitiği gibi ihtiyaçlarını karşılamak için kullanılan popüler bir dağıtık arama ve analiz motorudur. Elasticsearch’in güçlü arama yetenekleri ve ölçeklenebilir yapısı, büyük veri kümeleri üzerinde etkili bir şekilde çalışmasını sağlar.
Spring Data Elasticsearch kullanarak bir Spring uygulamasında Elasticsearch’ü nasıl indeksleyeceğimizi, arayacağımızı ve sorgulayacağımızı öğreneceğiz. Spring Data Elasticseach, Lucene tabanlı arama motoruyla bağlantı kurmayı sağlayan bir modüldür.
Elasticsearch örneğimiz için bir docker imajı kullanacağız.
docker run -d --name es762 -p 9200:9200 -e "discovery.type=single-node" elasticsearch:7.6.2
Spring Data Elasticsearch’ün, arama motoru için bir Java API’si mevcuttur. Bunu kullanmak için pom.xml’ye yeni bir bağımlılık eklememiz gerekiyor:
<dependency> <groupId>org.springframework.data</groupId> <artifactId>spring-data-elasticsearch</artifactId> <version>4.0.0.RELEASE</version> </dependency>
Spring Data ElasticSearch için Repository’leri Tanımlayalım
Yeni repositoryler tanımlarken ve ElasticsearchRepository sınıfını extend edeceğiz. ElasticsearchRepository’de PagingAndSortingRepository’den kalıtım aldığı için verilerimizde sayfalama ve sıralama gibi konularda destek sağlar.
Örneğimizde, sayfalama özelliğini kullanacağız:
public interface BookRepository extends ElasticsearchRepository<Book, String> { Page<Book> findByAuthorsName(String name, Pageable pageable); @Query("{\"bool\": {\"must\": [{\"match\": {\"authors.name\": \"?0\"}}]}}") Page<Book> findByAuthorsName(String name, Pageable pageable); }
Bu örnekten, BookRepository adında bir arayüz tanımlıyoruz ve ElasticsearchRepository arayüzünü genişletiyoruz. Book sınıfı belgeleri temsil ederken, String ise birincil anahtar türünü belirtir. BookRepository arayüzü, yazar adına göre kitapları bulan ve sayfalayan iki özel arama yöntemini içerir. İlk yöntem, Pageable nesnesi aracılığıyla sayfalama özelliğini kullanırken, ikinci yöntem @Query anotasyonuyla birlikte Elasticsearch sorgusu kullanır. Bu sayede, ElasticsearchRepository’nin sağladığı yerleşik destekten faydalanarak, veri tabanındaki verileri kolayca sayfalandırabilir ve sıralayabiliriz.
Java Konfigürasyonu
Java uygulamamızda Elasticsearch’ü yapılandırırken, Elasticsearch’e nasıl bağlanacağımızı tanımlamamız gerekir. Bunun için AbstractElasticsearchConfiguration sınıfını genişleteceğiz:
@Configuration @EnableElasticsearchRepositories(basePackages = "com.codingbytime.spring.data.bookapp.repository") @ComponentScan(basePackages = { "com.codingbytime.spring.data.bookapp.service" }) public class ElasticSearchConfig extends AbstractElasticsearchConfiguration { @Bean @Override public RestHighLevelClient elasticsearchClient() { ClientConfiguration clientConfiguration = ClientConfiguration.builder() .connectedTo("localhost:9200") .build(); return RestClients.create(clientConfiguration) .rest(); } }
EnableElasticsearchRepositories, Spring Data Elasticsearch’ün Spring Data varlıkları için sağlanan paketi taramasını sağlayacaktır.
Elasticsearch sunucusuna bağlanmak için basit bir RestHighLevelClient kullanıyoruz. ClientConfiguration.builder() yöntemi, Elasticsearch sunucusu ile bağlantı yapılandırmasını oluşturur ve connectedTo() metodu, Elasticsearch sunucusunun adresini ve bağlantı noktasını belirtir. Son olarak, RestClients.create() yöntemi, oluşturulan yapılandırmayı kullanarak RestHighLevelClient nesnesini oluşturur ve döndürür.
Elasticsearch, birden fazla istemci türü sağlasa da, RestHighLevelClient kullanmak, sunucuyla iletişimi gelişime açık hale getirmek için daha iyi bir yoldur. Bu istemci, Elasticsearch sunucusuna HTTP REST API üzerinden erişim sağlar ve Elasticsearch ile etkileşime geçmek için geniş bir yelpazede fonksiyonellik sunar.