天天看點

用Java實作ElacticSearch的基本操作

适合閱讀對象:小白

  1. 環境: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);
	}
}
           

繼續閱讀