SpringBoot集成ElasticSearch完成增删改查操作(六)

第一步.依赖配置

 <dependency>
    <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
     <version>2.0.2.RELEASE</version>
 </dependency>
 
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-web</artifactId>
     <version>2.0.2.RELEASE</version>
 </dependency>
 <dependency>
     <groupId>org.springframework.boot</groupId>
     <artifactId>spring-boot-starter-test</artifactId>
     <version>2.0.2.RELEASE</version>
     <scope>test</scope>
 </dependency>

二.连接配置

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 org.springframework.context.annotation.Primary;
import java.net.InetAddress;
/**
 * Created by ${ligh} on 2018/12/27 上午10:08
 */
@Configuration  //添加为配置类,可以在项目启动的时候加载到容器中
public class MyConfig {

    @Bean
    public TransportClient client() throws Exception {
        //添加ip地址连接配置
        InetSocketTransportAddress node = new InetSocketTransportAddress(
                InetAddress.getByName("localhost"),
                9300
        );
        Settings settings = Settings.builder()
                .put("cluster.name","wali")
                .build();
        //添加客户端
        TransportClient client = new PreBuiltTransportClient(settings);
        client.addTransportAddress(node);
        //可以添加多个作为集群
       // client.addTransportAddress();
        return client;
    }
}

三.增删改查操作接口

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.format.annotation.DateTimeFormat;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.util.ArrayList;
import java.util.Date;
import java.util.Map;

@RestController
public class HelloController {

    @Autowired
    private TransportClient client;

/**
 *  查询功能
 *
 * @param id
 * @return
 */
@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", "novel", id)
            .get();
    if(!result.isExists()){
        return new ResponseEntity(HttpStatus.NOT_FOUND);
    }
    return new ResponseEntity(result.getSource(),HttpStatus.OK);
}


/**
 * 添加功能
 *
 * @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_date")
                    @DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
                    Date publishDate
){
    try{
        XContentBuilder contentBuilder = 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","novel")
                .setSource(contentBuilder)
                .get();
        return new ResponseEntity(result.getId(),HttpStatus.OK);
    }catch (Exception e){
        e.printStackTrace();
        return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

/**
 *  删除
 *
 * @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(result.getResult().toString(),HttpStatus.OK);
}

/**
 *  修改操作
 *
 * @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);
    }catch (Exception e){
        e.printStackTrace();
        return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
    }
    try{
        UpdateResponse result = this.client.update(update).get();
        return new ResponseEntity(result.getResult().toString(),HttpStatus.OK);
    }catch (Exception e){
        e.printStackTrace();
        return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
    }
}

/**
 *  复合条件查询
 *  (可以随时加查询参数)
 * @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 && ltWordCount > 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.println(builder);
    SearchResponse response = builder.get();
    ArrayList<Map<String, Object>> result = new ArrayList<>();
    for (SearchHit hit : response.getHits()){
        result.add(hit.getSource());
    }
    return new ResponseEntity(result,HttpStatus.OK);
    }
 }

以上就完成了在Springboot项目中集成ElasticSearch搜索引擎。后期会更新对接口的封装的,使得像平常的接口一样。

猜你喜欢

转载自blog.csdn.net/ligh_sqh/article/details/85323791