spring-boot
スプリングブート+スプリングデータエラスティックサーチ
サーチ…
前書き
春データElasticsearchがある春データの実装Elasticsearchとの統合を提供しElasticsearchの検索エンジン。
SpringブートとSpring Data Elasticsearchの統合
この例では、elasticsearchにPOJOを格納するspring-data-elasticsearchプロジェクトを実装します。次のことを行うサンプルプロジェクトが表示されます。
-
Greeting(id, username, message)
アイテムをelasticsearchに挿入しGreeting(id, username, message)
。 - 挿入されたすべてのGreetingアイテムを取得します。
- グリーティングアイテムを更新します。
- グリーティングアイテムを削除します。
- グリーティングアイテムをIDで取得します。
- すべてのGreetingアイテムをユーザー名で取得します。
スプリングブートとスプリングデータelasticsearch統合
この例では、spring-data-elasticsearchを統合したmavenベースのスプリングブートアプリケーションを見ていきます。ここでは、以下のことを行い、それぞれのコードセグメントを見ていきます。
-
Greeting(id, username, message)
アイテムをelasticsearchに挿入しGreeting(id, username, message)
。 - elasticsearchからすべてのアイテムを取得
- 特定のアイテムを更新します。
- 特定のアイテムを削除します。
- 特定のアイテムをIDで取得します。
- ユーザー名で特定の項目を取得します。
プロジェクト構成ファイル(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
Spring Bootと、それぞれのバージョンのSpring Data Elasticsearchを使用します。このプロジェクトでは、apisをテストするためにelasticsearch-2.4.5を実行する必要があります。
プロパティファイル
プロジェクトプロパティファイル( 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()
メソッドは、Spring起動のSpringApplication.run()
メソッドを使用してアプリケーションを起動します。そこにはxml構成は必要ありませんが、このアプリケーションは純粋なJavaスプリングアプリケーションです。
弾性検索構成クラス(ElasticsearchConfig.java)
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との接続を行います。ここでは、 @PropertySource
を使用してapplication.properties
ファイルを読み込み、クラスタ名、elasticsearchホスト、およびポートを格納します。 @EnableElasticsearchRepositories
は、デフォルトでSpringデータリポジトリ用の注釈付き設定クラスのパッケージをスキャンするElasticsearchリポジトリを有効にするために使用されます。ここで@Value
は、 application.properties
ファイルからプロパティを読み取るために使用されます。
Client()
メソッドは、elasticsearchを使用してトランスポート接続を作成します。上記の設定では、 ElasticsearchTemplate
によって使用されるEmbedded Elasticsearch Serverが設定されます。 ElasticsearchTemplate
BeanはElasticsearch Client
を使用し、 Elasticsearch Client
データを操作するためのカスタムレイヤーを提供します。
モデルクラス(Greeting.java)
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;
}
}
ここでは、 Greeting
データオブジェクトに@Documentアノテーションを注釈しました。名前、シャード数、レプリカ数などのインデックス設定を決定する際にも使用できます。クラスの属性の1つはあることが必要であるid
とそれに注釈を付けるのいずれかによって、 @Id
または自動的に検出名のいずれかを使用してid
やdocumentId
。ここでは、 id
我々は、任意の値を設定しない場合、フィールドの値は、自動生成されますid
フィールドを。
弾性検索リポジトリクラス(GreetingRepository.class)
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
を拡張し、外部で定義する必要のないapiの多くを提供しています。これは、 elasticsearch
ベースのドメインクラスのベースリポジトリクラスです。 Spring
ベースのリポジトリクラスを拡張するので、さまざまな永続ストアのデータアクセスレイヤを実装するために必要な定型コードを回避できるという利点があります。
ここでは、 findByUsername(String username)
メソッドを宣言しました。これは、 Greeting
オブジェクトのusername
フィールドで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);
}
サービスBean(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);
}
}
上記のクラスでは、 GreetingRepository
を@Autowired
ています。 GreetingRepository
オブジェクトを使用して、 CRUDRepository
メソッドと、リポジトリクラスで宣言したメソッドを呼び出すことができます。
getAll()
メソッドでは、 Lists.newArrayList(repository.findAll())
という行が見つかることがあります。私たちはこれを行って、 repository.findAll()
をList<>
itemに変換して、 Iterable
リストを返します。
コントローラクラス(GreetingController.java)
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);
}
}
ビルド
このMavenアプリケーションをビルドするには
mvn clean install
上記のコマンドは、まずtarget
フォルダ内のすべてのファイルを削除してプロジェクトをビルドします。プロジェクトをビルドしたら、 springdataes-1.0-SNAPSHOT.jar
という実行可能な.jarファイルを取得します。メインクラス( Application.java
)を実行してプロセスを開始するか、単に次のように入力して上記のjarを実行します。
java -jar springdataes-1.0-SNAPSHOT.jar
APIの確認
elasticsearchにGreeting項目を挿入するには、以下のコマンドを実行します
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"}
次のコマンドを実行してget apiをチェックすることもできます:
curl -H "Content-Type: application/json" -X GET http://localhost:8080/api/greetings
あなたは取得する必要があります
[{"id":"AV2ddRxBcuirs1TrVgHH","username":"sunkuet02","message":"this is a message"}]
あなたは上記のプロセスに従って他のapisをチェックすることができます。
公式文書: