适合閱讀對象:小白
- 環境:java1.8,Elaticsearch6.1.1
springboot內建ES,需要在pom.xml檔案中添加依賴:
<dependency>
<groupId>org.elasticsearch.client</groupId>
<artifactId>transport</artifactId>
<version>6.1.1</version>
</dependency>
<dependency>
<groupId>org.apache.logging.log4j</groupId>
<artifactId>log4j-core</artifactId>
<version>2.7</version>
</dependency>
注意:目前log4j目前最高隻支援到2.7版本
2.添加log4j.propertes檔案
3.建立基本類
ElasticSearch (服務預設端口 9300, Web 管理平台端口 9200)
package com.myproject.se_test;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.TransportAddress;
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 admin on 2017/12/27.
*/
@Configuration
public class MyConfig {
@Bean
public TransportClient client() throws UnknownHostException {
Settings settings= Settings.builder().put("cluster.name","main").build();
TransportClient client=new PreBuiltTransportClient(settings)
.addTransportAddress(new TransportAddress(InetAddress.getByName("localhost"), 9300));
TransportAddress transportAddress=new TransportAddress(InetAddress.getByName("localhost"), 8300);//節點2
client.addTransportAddress(transportAddress);
return client;
}
}
4.工具類bean:用于存放傳回資料
package com.myproject.se_test;
/**
* Created by admin on 2017/12/27.
*/
public class ResponseEntity {
private int code;
private String msg;
private Object object;
public int getCode() {
return code;
}
public void setCode(int code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getObjects() {
return object;
}
public void setObject(Object object) {
this.object = object;
}
public ResponseEntity() {
}
public ResponseEntity(int code, String msg, Object object) {
this.code = code;
this.msg = msg;
this.object = object;
}
}
5.控制類
package com.myproject;
import com.myproject.se_test.ResponseEntity;
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.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.web.bind.annotation.*;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;
import static org.elasticsearch.common.xcontent.XContentFactory.jsonBuilder;
@SpringBootApplication
@RestController
public class SpringbootSeApplication {
@Autowired
private TransportClient client;
@GetMapping("/")
public String indes(){
return"index";
}
/**
* 根據id查詢
* @param id
* @return
*/
@GetMapping("get/book/novel")
@ResponseBody
public ResponseEntity get(@RequestParam(name = "id",defaultValue = "")String id){
GetResponse response= this.client.prepareGet("book","novel",id).get();
if(!response.isExists()){//如果不存在
return null;
}
ResponseEntity responseEntity=new ResponseEntity(200,"ok",response.getSource());
return responseEntity;
}
/**
* 添加資料
* @param title
* @param author
* @param wordcount
* @param publishDate
* @return
*/
@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_data") @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date publishDate){
try{
SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd");
XContentBuilder content= jsonBuilder().startObject()
.field("title",title)
.field("author",author)
.field("word_count",wordcount)
.field("publicsh_date",sdf.format(publishDate))
.endObject();
IndexResponse result=this.client.prepareIndex("book","novel").setSource(content).get();
return new ResponseEntity(200,"ok",result.getId());
}catch (Exception e){
e.printStackTrace();
return new ResponseEntity(500,"error",null);
}
}
/**
* 根據id删除
* @param id
* @return
*/
@DeleteMapping("delete/book/novel")
@ResponseBody
public ResponseEntity delete(@RequestParam(name ="id" ) String id){
DeleteResponse result=this.client.prepareDelete("book","novel",id).get();
return new ResponseEntity(200,"ok",result.getResult().toString());
}
/**
* 更新
* @param id
* @param title
* @param author
* @return
*/
@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
){
UpdateRequest update=new UpdateRequest("book","novel",id);
try {
XContentBuilder builder=XContentFactory .jsonBuilder()
.startObject();
if(title!=null){
builder.field("title",title);
}
if(author!=null){
builder.field("author",author);
}
builder.endObject();
update.doc(builder);
UpdateResponse result=this.client.update(update).get();
return new ResponseEntity(200,"ok",result.getResult());
}catch (Exception e){
e.printStackTrace();
return new ResponseEntity(500,"error",null);
}
}
/**
* 查詢
* @param author
* @param title
* @param gtwordcount
* @param ltwordcount
* @return
*/
@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 boolQuery=QueryBuilders.boolQuery();
if(author!=null){
boolQuery.must(QueryBuilders.matchQuery("author",author));
}
if(title!=null){
boolQuery.must(QueryBuilders.matchQuery("title",title));
}
RangeQueryBuilder rangeQuery=QueryBuilders.rangeQuery("word_count").from(gtwordcount);//範圍查詢
if(ltwordcount!=null&<wordcount>0){
rangeQuery.to(ltwordcount);
}
boolQuery.filter(rangeQuery);
SearchRequestBuilder builder=this.client.prepareSearch("book").setTypes("novel")
.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
.setQuery(boolQuery)
.setFrom(0)
.setSize(10);
System.out.printf(builder.toString());
SearchResponse response=builder.get();
List<Map<String,Object>> result=new ArrayList<Map<String,Object>>();
for(SearchHit hit:response.getHits()){
result.add(hit.getSourceAsMap());
}
return new ResponseEntity(200,"ok",result);
}
public static void main(String[] args) {
SpringApplication.run(SpringbootSeApplication.class, args);
}
}