spring-boot
स्प्रिंग बूट + स्प्रिंग डेटा एलिटिक्स खोज
खोज…
परिचय
स्प्रिंग डाटा Elasticsearch एक है वसंत डाटा के लिए कार्यान्वयन Elasticsearch जिसके साथ एकीकरण प्रदान करता है Elasticsearch खोज इंजन।
स्प्रिंग बूट और स्प्रिंग डेटा एलीस्टेकर्च एकीकरण
इस उदाहरण में हम POJO को इलास्टिक्स खोज में संग्रहीत करने के लिए स्प्रिंग-डेटा-इलास्टिक्स खोज परियोजना को लागू करने जा रहे हैं। हम एक नमूना मावेन परियोजना देखेंगे जो अनुसरण करता है:
- इलास्टिसर्च पर
Greeting(id, username, message)
आइटम डालें। - वे सभी ग्रीटिंग आइटम प्राप्त करें, जिन्हें सम्मिलित किया गया है।
- एक ग्रीटिंग आइटम को अपडेट करें।
- ग्रीटिंग आइटम हटाएं।
- आईडी द्वारा ग्रीटिंग आइटम प्राप्त करें।
- उपयोगकर्ता नाम से सभी ग्रीटिंग आइटम प्राप्त करें।
स्प्रिंग बूट और स्प्रिंग डेटा इलास्टिसिट एकीकरण
इस उदाहरण में हम एक मावेन आधारित स्प्रिंग बूट एप्लिकेशन को देखने जा रहे हैं जो स्प्रिंग-डेटा-इलास्टिक्स खोज को एकीकृत करता है। यहां, हम अनुसरण करेंगे और संबंधित कोड सेगमेंट देखेंगे।
- इलास्टिसर्च पर
Greeting(id, username, message)
आइटम डालें। - इलास्टिसर्च से सभी आइटम प्राप्त करें
- किसी विशिष्ट आइटम को अपडेट करें।
- कोई विशिष्ट आइटम हटाएं।
- आईडी द्वारा एक विशिष्ट आइटम प्राप्त करें।
- उपयोगकर्ता नाम से एक विशिष्ट आइटम प्राप्त करें।
प्रोजेक्ट कॉन्फ़िगरेशन फ़ाइल (pom.xml)
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>org.springdataes</groupId>
<artifactId>springdataes</artifactId>
<version>1.0-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>1.5.6.RELEASE</version>
</parent>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
</dependencies>
<build>
<plugins>
<plugin>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-maven-plugin</artifactId>
<executions>
<execution>
<goals>
<goal>repackage</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>
</project>
हम उस संस्करण के स्प्रिंग बूट संस्करण 1.5.6.RELEASE
का उपयोग करेंगे। 1.5.6.RELEASE
और उस संबंधित संस्करण की स्प्रिंग डेटा 1.5.6.RELEASE
। इस परियोजना के लिए, हम चलाने की आवश्यकता elasticsearch-2.4.5 अपने API को परीक्षण करने के लिए।
गुण फ़ाइल
हम प्रॉजेक्ट प्रॉपर्टी फाइल (नामित applications.properties
) को resources
फोल्डर में डालेंगे जिसमें शामिल हैं:
elasticsearch.clustername = elasticsearch
elasticsearch.host = localhost
elasticsearch.port = 9300
हम डिफ़ॉल्ट क्लस्टर नाम, होस्ट और पोर्ट का उपयोग करेंगे। डिफ़ॉल्ट रूप से, 9300
पोर्ट का उपयोग ट्रांसपोर्ट पोर्ट के रूप में किया जाता है और 9200
पोर्ट को http पोर्ट के रूप में जाना जाता है। डिफ़ॉल्ट क्लस्टर नाम हिट http: // localhost: 9200 / देखने के लिए ।
मुख्य वर्ग (Application.java)
package org.springdataes;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class Application {
public static void main(String []args) {
SpringApplication.run(Application.class, args);
}
}
@SpringBootApplication
@Configuration
, @EnableAutoConfiguration
, @EnableWebMvc
और @ComponentScan
एनोटेशन का संयोजन है। main()
विधि एप्लिकेशन को लॉन्च करने के लिए स्प्रिंग SpringApplication.run()
स्प्रिंगएप्लीकेशन.रून main()
विधि का उपयोग करती है। वहां हमें किसी भी xml कॉन्फ़िगरेशन की आवश्यकता नहीं है, यह एप्लिकेशन शुद्ध जावा स्प्रिंग एप्लीकेशन है।
एलेस्टिक्स खोज कॉन्फ़िगरेशन क्लास (एलियस्टीसर्चकॉन्फिग.जवा)
package org.springdataes.config;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.context.annotation.PropertySource;
import org.springframework.data.elasticsearch.core.ElasticsearchOperations;
import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;
import org.springframework.data.elasticsearch.repository.config.EnableElasticsearchRepositories;
import java.net.InetAddress;
@Configuration
@PropertySource(value = "classpath:applications.properties")
@EnableElasticsearchRepositories(basePackages = "org.springdataes.dao")
public class ElasticsearchConfig {
@Value("${elasticsearch.host}")
private String EsHost;
@Value("${elasticsearch.port}")
private int EsPort;
@Value("${elasticsearch.clustername}")
private String EsClusterName;
@Bean
public Client client() throws Exception {
Settings esSettings = Settings.settingsBuilder()
.put("cluster.name", EsClusterName)
.build();
return TransportClient.builder()
.settings(esSettings)
.build()
.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(EsHost), EsPort));
}
@Bean
public ElasticsearchOperations elasticsearchTemplate() throws Exception {
return new ElasticsearchTemplate(client());
}
}
ElasticsearchConfig
वर्ग इस परियोजना के लिए elasticsearch को कॉन्फ़िगर करता है और elasticsearch के साथ एक संबंध बनाता है। यहां, application.properties
फ़ाइल को पढ़ने के लिए @PropertySource
का उपयोग किया जाता है, जहां हम क्लस्टर नाम, इलास्टिक्स खोज होस्ट और पोर्ट स्टोर करते हैं। @EnableElasticsearchRepositories
Elasticsearch रिपॉजिटरी को सक्षम करने के लिए उपयोग किया जाता है, जो डिफ़ॉल्ट रूप से स्प्रिंग डेटा रिपॉजिटरी के लिए एनोटेट कॉन्फ़िगरेशन वर्ग के पैकेज को स्कैन करेगा। @Value
का उपयोग यहां किया गया है ताकि application.properties
से गुण पढ़ @Value
।
Client()
विधि इलास्टिक्स खोज के साथ परिवहन कनेक्शन बनाती है। ऊपर दिया गया कॉन्फ़िगरेशन एंबेडेड एलीस्टेकर्च सर्वर को सेट करता है जिसका उपयोग ElasticsearchTemplate
द्वारा किया जाता है। ElasticsearchTemplate
बीन Elasticsearch Client
का उपयोग करता है और Elasticsearch Client
में डेटा में हेरफेर के लिए एक कस्टम परत प्रदान करता है।
मॉडल वर्ग (अभिवादन)
package org.springdataes.model;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import java.io.Serializable;
@Document(indexName = "index", type = "greetings")
public class Greeting implements Serializable{
@Id
private String id;
private String username;
private String message;
public Greeting() {
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getUsername() {
return username;
}
public void setUsername(String username) {
this.username = username;
}
public String getMessage() {
return message;
}
public void setMessage(String message) {
this.message = message;
}
}
यहाँ हमने एक @Document एनोटेशन के साथ अपनी Greeting
डेटा ऑब्जेक्ट्स को एनोटेट किया है जिसका उपयोग हम इंडेक्स सेटिंग्स जैसे नाम, शार्ड की संख्या या प्रतिकृतियों की संख्या निर्धारित करने के लिए भी कर सकते हैं। वर्ग की विशेषताओं में से एक को id
आवश्यकता है, या तो इसे @Id
साथ @Id
करके या स्वचालित रूप से पाए गए नामों में से एक id
या documentId
का उपयोग करके। यहां, यदि हम id
फ़ील्ड का कोई मूल्य निर्धारित नहीं करते हैं, तो id
फ़ील्ड मान स्वतः-जनरेट किया जाएगा।
एलेस्टिक्स खोज रिपोजिटरी क्लास (ग्रीटिंग रिपॉजिटरी.क्लास)
package org.springdataes.dao;
import org.springdataes.model.Greeting;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
import java.util.List;
public interface GreetingRepository extends ElasticsearchRepository<Greeting, String> {
List<Greeting> findByUsername(String username);
}
यहाँ, हमने ElasticsearchRepository
को विस्तारित किया है जो हमें कई एपिस प्रदान करता है जिन्हें हमें बाहरी रूप से परिभाषित करने की आवश्यकता नहीं है। यह elasticsearch
आधारित डोमेन कक्षाओं के लिए आधार भंडार वर्ग है। चूंकि यह Spring
आधारित रिपॉजिटरी कक्षाओं का विस्तार करता है, इसलिए हमें विभिन्न प्रेरक स्टोरों के लिए डेटा एक्सेस लेयर को लागू करने के लिए आवश्यक बॉयलरप्लेट कोड से बचने का लाभ मिलता है।
यहां हमने एक तरीका findByUsername(String username)
घोषित किया है, जो एक मिलान क्वेरी में परिवर्तित हो जाएगा जो उपयोगकर्ता नाम के साथ Greeting
वस्तुओं के username
फ़ील्ड के साथ मेल खाता है और परिणामों की सूची लौटाता है।
सर्विसेज (GreetingService.java)
package org.springdataes.service;
import org.springdataes.model.Greeting;
import java.util.List;
public interface GreetingService {
List<Greeting> getAll();
Greeting findOne(String id);
Greeting create(Greeting greeting);
Greeting update(Greeting greeting);
List<Greeting> getGreetingByUsername(String username);
void delete(String id);
}
सेवा बीन (GreetingServiceBean.java)
package org.springdataes.service;
import com.google.common.collect.Lists;
import org.springdataes.dao.GreetingRepository;
import org.springdataes.model.Greeting;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import java.util.List;
@Service
public class GreetingServiceBean implements GreetingService {
@Autowired
private GreetingRepository repository;
@Override
public List<Greeting> getAll() {
return Lists.newArrayList(repository.findAll());
}
@Override
public Greeting findOne(String id) {
return repository.findOne(id);
}
@Override
public Greeting create(Greeting greeting) {
return repository.save(greeting);
}
@Override
public Greeting update(Greeting greeting) {
Greeting persitedGreeting = repository.findOne(greeting.getId());
if(persitedGreeting == null) {
return null;
}
return repository.save(greeting);
}
@Override
public List<Greeting> getGreetingByUsername(String username) {
return repository.findByUsername(username);
}
@Override
public void delete(String id) {
repository.delete(id);
}
}
ऊपर वर्ग में, हम है @Autowired
GreetingRepository
। हम बस CRUDRepository
विधियों और जिस विधि को हमने रिपॉजिटरी क्लास में घोषित किया है, उसे GreetingRepository
ऑब्जेक्ट के साथ कॉल कर सकते हैं।
getAll()
विधि में, आपको एक पंक्ति Lists.newArrayList(repository.findAll())
। हमने यह repository.findAll()
Iterable
repository.findAll()
को List<>
आइटम में बदलने के लिए किया है क्योंकि यह एक Iterable
सूची देता है।
नियंत्रक वर्ग (ग्रीटिंगकंट्रोलर.जावा)
package org.springdataes.controller;
import org.springdataes.model.Greeting;
import org.springdataes.service.GreetingService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.List;
@RestController
@RequestMapping("/api")
public class GreetingController {
@Autowired
private GreetingService greetingService;
@ResponseBody
@RequestMapping(value = "/greetings", method = RequestMethod.GET)
public ResponseEntity<List<Greeting>> getAll() {
return new ResponseEntity<List<Greeting>>(greetingService.getAll(), HttpStatus.OK);
}
@ResponseBody
@RequestMapping(value = "/greetings", method = RequestMethod.POST)
public ResponseEntity<Greeting> insertGreeting(@RequestBody Greeting greeting) {
return new ResponseEntity<Greeting>(greetingService.create(greeting), HttpStatus.CREATED);
}
@ResponseBody
@RequestMapping(value = "/greetings", method = RequestMethod.PUT)
public ResponseEntity<Greeting> updateGreeting(@RequestBody Greeting greeting) {
return new ResponseEntity<Greeting>(greetingService.update(greeting), HttpStatus.MOVED_PERMANENTLY);
}
@ResponseBody
@RequestMapping(value = "/greetings/{id}", method = RequestMethod.DELETE)
public ResponseEntity<Greeting> deleteGreeting(@PathVariable("id") String idd) {
greetingService.delete(idd);
return new ResponseEntity<Greeting>(HttpStatus.NO_CONTENT);
}
@ResponseBody
@RequestMapping(value = "/greetings{id}", method = RequestMethod.POST)
public ResponseEntity<Greeting> getOne(@PathVariable("id") String idd) {
return new ResponseEntity<Greeting>(greetingService.findOne(idd), HttpStatus.OK);
}
@ResponseBody
@RequestMapping(value = "/greetings/{name}", method = RequestMethod.GET)
public ResponseEntity<List<Greeting>> getByUserName(@PathVariable("name") String name) {
return new ResponseEntity<List<Greeting>>(greetingService.getGreetingByUsername(name), HttpStatus.OK);
}
}
बिल्ड
इस मावेन एप्लिकेशन को चलाने के लिए
mvn clean install
ऊपर कमांड पहले target
फ़ोल्डर में सभी फाइलों को हटा दें और परियोजना का निर्माण करें। परियोजना के निर्माण के बाद हमें निष्पादन योग्य .jar फ़ाइल springdataes-1.0-SNAPSHOT.jar
जिसे springdataes-1.0-SNAPSHOT.jar
नाम दिया गया है। हम मुख्य वर्ग ( Application.java
) को इस प्रक्रिया को शुरू करने के लिए चला सकते हैं या केवल ऊपर के जार को टाइप करके निष्पादित कर सकते हैं:
java -jar springdataes-1.0-SNAPSHOT.jar
एपीआई की जाँच करना
इलास्टिक्स खोज में ग्रीटिंग आइटम डालने के लिए, नीचे दिए गए कमांड को निष्पादित करें
curl -H "Content-Type: application/json" -X POST -d '{"username":"sunkuet02","message": "this is a message"}' http://localhost:8080/api/greetings
आपको नीचे जैसा परिणाम मिलना चाहिए
{"id":"AV2ddRxBcuirs1TrVgHH","username":"sunkuet02","message":"this is a message"}
आप एसीसी को निष्पादित करके भी देख सकते हैं:
curl -H "Content-Type: application/json" -X GET http://localhost:8080/api/greetings
आपको मिलना चाहिये
[{"id":"AV2ddRxBcuirs1TrVgHH","username":"sunkuet02","message":"this is a message"}]
आप उपरोक्त प्रक्रियाओं का पालन करके अन्य एपिस की जांच कर सकते हैं।
आधिकारिक दस्तावेज: