Spring boot with Elasticsearch 5.5.1


声明:本文转载自https://my.oschina.net/neochen/blog/1498509,转载目的在于传递更多信息,仅供学习交流之用。如有侵权行为,请联系我,我会及时删除。

本文节选自《Netkiller Java 手札》 作者:netkiller 网站: http://www.netkiller.cn

5.27. Spring boot with Elasticsearch 5.5.x

Spring data 目前还不支持 Elasticsearch 5.5.x 所以需要通过注入 TransportClient 这就意味着使用 5.5.x 版本你无法使用 ElasticsearchRepository 这种特性,只能通过官方的 TransportClient 操作 Elasticsearch。

5.27.1. Maven

Elasticsearch 依赖下来四个包

<dependency> 			<groupId>org.elasticsearch</groupId> 			<artifactId>elasticsearch</artifactId> 			<version>5.5.1</version> 		</dependency> 		<dependency> 			<groupId>org.elasticsearch.client</groupId> 			<artifactId>transport</artifactId> 			<version>5.5.1</version> 		</dependency> 		<dependency> 			<groupId>org.apache.logging.log4j</groupId> 			<artifactId>log4j-api</artifactId> 			<version>2.8.2</version> 		</dependency> 		<dependency> 			<groupId>org.apache.logging.log4j</groupId> 			<artifactId>log4j-core</artifactId> 			<version>2.8.2</version> 		</dependency>

下面是我的完整例子

<?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>com.example</groupId> 	<artifactId>api</artifactId> 	<version>0.0.1-SNAPSHOT</version> 	<packaging>jar</packaging>  	<name>api</name> 	<description>Demo project for Spring Boot</description>  	<parent> 		<groupId>org.springframework.boot</groupId> 		<artifactId>spring-boot-starter-parent</artifactId> 		<version>1.5.6.RELEASE</version> 		<relativePath /> <!-- lookup parent from repository --> 	</parent>  	<properties> 		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> 		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> 		<java.version>1.8</java.version> 	</properties>  	<dependencies> 		<dependency> 			<groupId>org.springframework.boot</groupId> 			<artifactId>spring-boot-starter-data-jpa</artifactId> 		</dependency> 		<dependency> 			<groupId>org.springframework.boot</groupId> 			<artifactId>spring-boot-starter-jdbc</artifactId> 		</dependency> 		<dependency> 			<groupId>org.springframework.boot</groupId> 			<artifactId>spring-boot-starter-security</artifactId> 		</dependency> 		<dependency> 			<groupId>org.springframework.boot</groupId> 			<artifactId>spring-boot-starter-web</artifactId> 		</dependency> 		<!-- <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId>  			</dependency> --> 		<dependency> 			<groupId>mysql</groupId> 			<artifactId>mysql-connector-java</artifactId> 			<scope>runtime</scope> 		</dependency> 		<dependency> 			<groupId>org.springframework.boot</groupId> 			<artifactId>spring-boot-starter-test</artifactId> 			<scope>test</scope> 		</dependency> 		<dependency> 			<groupId>org.springframework.boot</groupId> 			<artifactId>spring-boot-starter-data-redis</artifactId> 		</dependency> 		<!-- https://mvnrepository.com/artifact/javax.persistence/persistence-api --> 		<dependency> 			<groupId>javax.persistence</groupId> 			<artifactId>persistence-api</artifactId> 			<version>1.0.2</version> 		</dependency> 		<!-- https://mvnrepository.com/artifact/org.json/json --> 		<dependency> 			<groupId>org.json</groupId> 			<artifactId>json</artifactId> 		</dependency> 		<dependency> 			<groupId>org.elasticsearch</groupId> 			<artifactId>elasticsearch</artifactId> 			<version>5.5.1</version> 		</dependency> 		<dependency> 			<groupId>org.elasticsearch.client</groupId> 			<artifactId>transport</artifactId> 			<version>5.5.1</version> 		</dependency> 		<dependency> 			<groupId>org.apache.logging.log4j</groupId> 			<artifactId>log4j-api</artifactId> 			<version>2.8.2</version> 		</dependency> 		<dependency> 			<groupId>org.apache.logging.log4j</groupId> 			<artifactId>log4j-core</artifactId> 			<version>2.8.2</version> 		</dependency> 	</dependencies>  	<build> 		<plugins> 			<plugin> 				<groupId>org.springframework.boot</groupId> 				<artifactId>spring-boot-maven-plugin</artifactId> 			</plugin>  			<plugin> 				<groupId>org.apache.maven.plugins</groupId> 				<artifactId>maven-surefire-plugin</artifactId> 				<configuration> 					<skip>true</skip> 				</configuration> 			</plugin> 		</plugins> 	</build> </project>

5.27.2. Application

package cn.netkiller;  import org.springframework.boot.SpringApplication; import org.springframework.boot.autoconfigure.EnableAutoConfiguration; import org.springframework.boot.autoconfigure.SpringBootApplication; import org.springframework.context.annotation.ComponentScan; import org.springframework.data.jpa.repository.config.EnableJpaRepositories; import org.springframework.data.mongodb.repository.config.EnableMongoRepositories; import org.springframework.scheduling.annotation.EnableScheduling;  @SpringBootApplication @EnableAutoConfiguration @ComponentScan @EnableMongoRepositories @EnableJpaRepositories @EnableScheduling public class Application {         public static void main(String[] args) {                SpringApplication.run(Application.class, args);        } }

5.27.3. application.properties

注意:Elasticsearch 连接地址是 9300, 而不是 9200

spring.data.elasticsearch.cluster-nodes=172.0.0.1:9300 spring.data.elasticsearch.local=false spring.data.elasticsearch.properties.transport.tcp.connect_timeout=60s

5.27.4. ElasticsearchConfiguration

package com.example.api.config;  import java.net.InetAddress; import java.net.UnknownHostException;  import org.elasticsearch.client.transport.TransportClient; import org.elasticsearch.common.transport.InetSocketTransportAddress; import org.elasticsearch.transport.client.PreBuiltTransportClient; import org.elasticsearch.common.settings.Settings; import org.slf4j.Logger; import org.slf4j.LoggerFactory; import org.springframework.beans.factory.DisposableBean; import org.springframework.beans.factory.FactoryBean; import org.springframework.beans.factory.InitializingBean; import org.springframework.beans.factory.annotation.Value; import org.springframework.context.annotation.Configuration;  @Configuration public class ElasticsearchConfiguration implements FactoryBean<TransportClient>, InitializingBean, DisposableBean { 	private static final Logger logger = LoggerFactory.getLogger(ElasticsearchConfiguration.class);  	@Value("${spring.data.elasticsearch.cluster-nodes}") 	private String clusterNodes;  	private TransportClient transportClient; 	private PreBuiltTransportClient preBuiltTransportClient;  	@Override 	public void destroy() throws Exception { 		try { 			logger.info("Closing elasticSearch client"); 			if (transportClient != null) { 				transportClient.close(); 			} 		} catch (final Exception e) { 			logger.error("Error closing ElasticSearch client: ", e); 		} 	}  	@Override 	public TransportClient getObject() throws Exception { 		return transportClient; 	}  	@Override 	public Class<TransportClient> getObjectType() { 		return TransportClient.class; 	}  	@Override 	public boolean isSingleton() { 		return false; 	}  	@Override 	public void afterPropertiesSet() throws Exception { 		buildClient(); 	}  	protected void buildClient() { 		try { 			preBuiltTransportClient = new PreBuiltTransportClient(settings());  			String InetSocket[] = clusterNodes.split(":"); 			String address = InetSocket[0]; 			Integer port = Integer.valueOf(InetSocket[1]); 			transportClient = preBuiltTransportClient.addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName(address), port));  		} catch (UnknownHostException e) { 			logger.error(e.getMessage()); 		} 	}  	/** 	 * 初始化默认的client 	 */ 	private Settings settings() { //		Settings settings = Settings.builder().put("cluster.name", clusterName).put("client.transport.sniff", true).build(); 		Settings settings = Settings.builder().put("cluster.name", "elasticsearch").build(); 		return settings; 	} }

5.27.5. RestController

package com.example.api.restful;  import org.elasticsearch.action.get.GetResponse; import org.elasticsearch.client.transport.TransportClient; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping; import org.springframework.web.bind.annotation.RestController;  @RestController @RequestMapping("/restful/search") public class SearchRestController {  	@Autowired 	private TransportClient client;  	@RequestMapping(value = "/client/{articleId}") 	public GetResponse test(@PathVariable String articleId) { 		GetResponse response = client.prepareGet("information", "article", articleId).get(); 		return response; 	} }

使用 Curl 测试 restful 接口

MacBook-Pro:~ neo$ curl -k https://test:test@localhost:8443/restful/search/client/1093.json {"fields":{},"id":"1093","type":"article","source":{"@timestamp":"2017-07-31T05:41:00.248Z","author":"test","@version":"1","description":"test","ctime":"2017-07-31T05:40:35.000Z","id":1093,"source":"test","title":"test11111","content":"<p>test</p><p>aaaaaaaaaaaaaa</p>"},"version":3,"index":"information","sourceAsBytes":"eyJAdGltZXN0YW1wIjoiMjAxNy0wNy0zMVQwNTo0MTowMC4yNDhaIiwiYXV0aG9yIjoidGVzdCIsIkB2ZXJzaW9uIjoiMSIsImRlc2NyaXB0aW9uIjoidGVzdCIsImN0aW1lIjoiMjAxNy0wNy0zMVQwNTo0MDozNS4wMDBaIiwiaWQiOjEwOTMsInNvdXJjZSI6InRlc3QiLCJ0aXRsZSI6InRlc3QxMTExMSIsImNvbnRlbnQiOiI8cD50ZXN0PC9wPjxwPmFhYWFhYWFhYWFhYWFhPC9wPiJ9","sourceInternal":{"childResources":[]},"sourceAsString":"{\"@timestamp\":\"2017-07-31T05:41:00.248Z\",\"author\":\"test\",\"@version\":\"1\",\"description\":\"test\",\"ctime\":\"2017-07-31T05:40:35.000Z\",\"id\":1093,\"source\":\"test\",\"title\":\"test11111\",\"content\":\"<p>test</p><p>aaaaaaaaaaaaaa</p>\"}","sourceEmpty":false,"sourceAsMap":{"@timestamp":"2017-07-31T05:41:00.248Z","author":"test","@version":"1","description":"test","ctime":"2017-07-31T05:40:35.000Z","id":1093,"source":"test","title":"test11111","content":"<p>test</p><p>aaaaaaaaaaaaaa</p>"},"exists":true,"sourceAsBytesRef":{"childResources":[]},"fragment":false}

本文发表于2017年08月01日 10:36
(c)注:本文转载自https://my.oschina.net/neochen/blog/1498509,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如有侵权行为,请联系我们,我们会及时删除.

阅读 2271 讨论 0 喜欢 0

抢先体验

扫码体验
趣味小程序
文字表情生成器

闪念胶囊

你要过得好哇,这样我才能恨你啊,你要是过得不好,我都不知道该恨你还是拥抱你啊。

直抵黄龙府,与诸君痛饮尔。

那时陪伴我的人啊,你们如今在何方。

不出意外的话,我们再也不会见了,祝你前程似锦。

这世界真好,吃野东西也要留出这条命来看看

快捷链接
网站地图
提交友链
Copyright © 2016 - 2021 Cion.
All Rights Reserved.
京ICP备2021004668号-1