サーチ…


前書き

春データ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または自動的に検出名のいずれかを使用してiddocumentId 。ここでは、 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をチェックすることができます。

公式文書:



Modified text is an extract of the original Stack Overflow Documentation
ライセンスを受けた CC BY-SA 3.0
所属していない Stack Overflow