springboot集成elasticsearch
1、首先生成springboot maven工程
2、pom.xml 配置jar包
<?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.es</groupId> <artifactId>demo</artifactId> <version>1.0</version> <packaging>jar</packaging> <name>demoEs</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> </parent> <properties> <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding> <project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding> <java.version>1.8</java.version> <elasticsearch.version>5.5.2</elasticsearch.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.elasticsearch.client</groupId> <artifactId>transport</artifactId> <version>${elasticsearch.version}</version> </dependency> <dependency> <groupId>org.apache.logging.log4j</groupId> <artifactId>log4j-core</artifactId> <scope>2.7</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project>
在application的同级目录下,新建myconf类
package com.es.demo;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.net.InetAddress;
import java.net.UnknownHostException;
/**
* Created by nicknailo on 2018/5/9.
*/
@Configuration
public class Myconfig {
@Bean
public TransportClient client() throws UnknownHostException {
InetSocketTransportAddress node = new InetSocketTransportAddress(
InetAddress.getByName("localhost"),9300);
Settings settings = Settings.builder()
.put("cluster.name","nicknailo-elasticsearch")
.put("client.transport.sniff",true)
.build();
TransportClient client = new PreBuiltTransportClient(settings);
client.addTransportAddress(node);
return client;
}
}
3、增加配置
在resourse目录下添加配置log4j2.properties
appender.console.type = Console appender.console.name = console appender.console.layout.type = PatternLayout appender.console.layout.pattern = [%t] %-5p %c - %m%n rootLogger.level = info rootLogger.appenderRef.console.ref = console
4、写逻辑
package com.es.demo;
import javafx.application.Application;
import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import java.util.concurrent.ExecutionException;
@SpringBootApplication
@RestController
public class DemoEsApplication {
@Autowired
private TransportClient client;
public static final org.slf4j.Logger logger = LoggerFactory.getLogger(DemoEsApplication.class);
private static final String BOOK_INDEX = "book";
private static final String BOOK_TYPE_NOVEL = "novel";
@GetMapping("/get/book/novel")
@ResponseBody
public ResponseEntity get(@RequestParam(name = "id",defaultValue = "")String id){
if(id.isEmpty()){
return new ResponseEntity(HttpStatus.NOT_FOUND);
}
GetResponse result = this.client.prepareGet(BOOK_INDEX,BOOK_TYPE_NOVEL,id).get();
if (!result.isExists()){
return new ResponseEntity(HttpStatus.NOT_FOUND);
}
return new ResponseEntity(result.getSource(), HttpStatus.OK);
}
@PostMapping("add/book/novel")
@ResponseBody
public ResponseEntity add(
@RequestParam(name = "title") String title,
@RequestParam(name = "author") String author,
@RequestParam(name = "word_count") int wordCount,
@RequestParam(name = "publish_date")
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date publishDate){
try {
XContentBuilder content = XContentFactory.jsonBuilder().startObject()
.field("title",title)
.field("author",author)
.field("word_count",wordCount)
.field("publish_date",publishDate.getTime())
.endObject();
IndexResponse result = this.client.prepareIndex(BOOK_INDEX,BOOK_TYPE_NOVEL)
.setSource(content)
.get();
return new ResponseEntity(result.getId(),HttpStatus.OK);
} catch (IOException e) {
e.printStackTrace();
return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@DeleteMapping("/delete/book/novel")
@ResponseBody
public ResponseEntity delete(@RequestParam(name = "id")String id ){
DeleteResponse response = client.prepareDelete(BOOK_INDEX,BOOK_TYPE_NOVEL,id).get();
return new ResponseEntity(response.getResult().toString(),HttpStatus.OK);
}
@PutMapping("/update/book/novel")
@ResponseBody
public ResponseEntity update(
@RequestParam(name = "id") String id,
@RequestParam(name = "title", required = false) String title,
@RequestParam(name = "author", required = false) String author,
@RequestParam(name = "word_count", required = false) Integer wordCount,
@RequestParam(name = "publish_date", required = false)
@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date publishDate){
UpdateRequest request = new UpdateRequest(BOOK_INDEX,BOOK_TYPE_NOVEL,id);
try {
XContentBuilder builder = XContentFactory.jsonBuilder().startObject();
if (title != null){
builder.field("title",title);
}
if (author != null){
builder.field("author",author);
}
if (wordCount != null){
builder.field("word_count",wordCount);
}
if (publishDate != null){
builder.field("publish_date",publishDate.getTime());
}
builder.endObject();
request.doc(builder);
} catch (IOException e) {
e.printStackTrace();
return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
}
try {
UpdateResponse response = this.client.update(request).get();
return new ResponseEntity(response.getResult().toString(),HttpStatus.OK);
} catch (InterruptedException e) {
e.printStackTrace();
return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
} catch (ExecutionException e) {
e.printStackTrace();
return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
}
}
@PostMapping("query/book/novel")
@ResponseBody
public ResponseEntity query(@RequestParam(name = "author", required = false) String author,
@RequestParam(name = "title", required = false) String title,
@RequestParam(name = "gt_word_count", defaultValue = "0") int gtWordCount,
@RequestParam(name = "lt_word_count", required = false) Integer ltWordCount){
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
if(author != null){
boolQueryBuilder.must(QueryBuilders.matchQuery("author",author));
}
if(title != null){
boolQueryBuilder.must(QueryBuilders.matchQuery("title",title));
}
RangeQueryBuilder rangeQuery = QueryBuilders.rangeQuery("word_count").from(gtWordCount);
if(ltWordCount != null && ltWordCount > 0){
rangeQuery.to(ltWordCount);
}
boolQueryBuilder.filter(rangeQuery);
SearchRequestBuilder builder = client.prepareSearch(BOOK_INDEX).setTypes(BOOK_TYPE_NOVEL)
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(boolQueryBuilder)
.setFrom(0)
.setSize(10);
logger.debug(builder.toString());
SearchResponse response = builder.get();
List result = new ArrayList<Map<String,Object>>();
for (SearchHit hit : response.getHits()){
result.add(hit.getSourceAsMap());
}
return new ResponseEntity(result,HttpStatus.OK);
}
public static void main(String[] args) {
SpringApplication.run(DemoEsApplication.class, args);
}
}
好了,可以测试了。
5、测试






浙公网安备 33010602011771号