加入收藏 | 设为首页 | 会员中心 | 我要投稿 李大同 (https://www.lidatong.com.cn/)- 科技、建站、经验、云计算、5G、大数据,站长网!
当前位置: 首页 > 编程开发 > Java > 正文

SpringBoot整合Elasticsearch并实现CRUD操作

发布时间:2020-12-14 19:58:14 所属栏目:Java 来源:网络整理
导读:配置准备 在build.gradle文件中添加如下依赖: compile "org.elasticsearch.client:transport:5.5.2" compile "org.elasticsearch:elasticsearch:5.5.2" //es 5.x的内部使用的 apache log4日志 compile "org.apache.logging.log4j:log4j-core:2.7" compile "

 配置准备

在build.gradle文件中添加如下依赖:

  compile "org.elasticsearch.client:transport:5.5.2"
  compile "org.elasticsearch:elasticsearch:5.5.2"
  //es 5.x的内部使用的 apache log4日志
  compile "org.apache.logging.log4j:log4j-core:2.7"
  compile "org.apache.logging.log4j:log4j-api:2.7"

这里spring boot使用的是1.5.4版,前些天spring boot 2正式版已经发布,spring boot 2新特性中有一条是支持kotlin,spring boot 2基于spring 5,spring 5也支持了koltin,所以spring也开始支持函数式编程。

关于版本兼容

这里写图片描述

配置访问Elasticsearch的客户端,这里都使用原生es JavaAPI。

@Configuration
public class ElasticSearchConfig {
  @Bean(name = "client")
  public TransportClient getClient() {
    InetSocketTransportAddress node = null;
    try {
      node = new InetSocketTransportAddress(InetAddress.getByName("192.168.124.128"),9300);
    } catch (UnknownHostException e) {
      e.printStackTrace();
    }
    Settings settings = Settings.builder().put("cluster.name","my-es").build();
    TransportClient client = new PreBuiltTransportClient(settings);
    client.addTransportAddress(node);
    return client;
  }
}

SocketTransport端口可以使用http://ip:9200/_nodes方式查看,这里默认使用的是9300端口。

CRUD操作

新建一个控制器ElasticSearchController,使用原生的es JavaAPI。

@RestController
public class ElasticSearchController {
  @Autowired
  TransportClient client;
}

在控制器中添加增删查改方法

增加操作

@PostMapping("add/book/novel")
  public ResponseEntity add(
      @RequestParam(name = "title") String title,@RequestParam(name = "authro") 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","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")
  public ResponseEntity delete(@RequestParam(name = "id") String id)
  {
    DeleteResponse result = client.prepareDelete("book","novel",id).get();
    return new ResponseEntity(result.getResult().toString(),HttpStatus.OK);
  }

查找操作

@GetMapping("/get/book/novel")
  public ResponseEntity get(@RequestParam(name = "id",defaultValue="") String id)
  {
    if (id.isEmpty())
    {
      return new ResponseEntity(HttpStatus.NOT_FOUND);
    }
    GetResponse result = this.client.prepareGet("book",id).get();
    if (!result.isExists())
    {
      return new ResponseEntity(HttpStatus.NOT_FOUND);
    }
    return new ResponseEntity(result.getSource(),HttpStatus.OK);
  }

更新操作

@PutMapping("/put/book/novel")
  public ResponseEntity update(@RequestParam(name = "id") String id,@RequestParam(name = "title",required = false) String title,@RequestParam(name = "author",required = false) String author
  )
  {
    try {
      XContentBuilder builder = XContentFactory.jsonBuilder().startObject();
      if (title!= null)
      {
        builder.field("title",title);
      }
      if (author != null)
      {
        builder.field("author",author);
      }
      builder.endObject();
      UpdateRequest updateRequest = new UpdateRequest("book",id);
      updateRequest.doc(builder);
      UpdateResponse result = client.update(updateRequest).get();
      return new ResponseEntity(result.getResult().toString(),HttpStatus.OK);
    } catch (Exception e) {
      e.printStackTrace();
      return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
    }
  }

复合查找

@GetMapping("/query/book/novel")
  public ResponseEntity query(@RequestParam(name = "author",required = false) String author,@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 rangeQueryBuilder = QueryBuilders.rangeQuery("word_count").from(gtWordCount);
    if (ltWordCount != null && ltWordCount > 0)
    {
      rangeQueryBuilder.to(ltWordCount);
    }
    boolQueryBuilder.filter(rangeQueryBuilder);
    SearchRequestBuilder searchRequestBuilder = this.client.prepareSearch("book")
        .setTypes("novel")
        .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
        .setQuery(boolQueryBuilder)
        .setFrom(0)
        .setSize(10);
    System.out.println(searchRequestBuilder); //调试用
    SearchResponse response = searchRequestBuilder.get();
    List<Map<String,Object>> result = new ArrayList<>();
    for (SearchHit hit : response.getHits())
    {
      result.add(hit.getSource());
    }
    return new ResponseEntity(result,HttpStatus.OK);
  }

上面的代码组织的复合查询类似下面的Query DSL:

{
  "query":{
    "bool":{
      "must":[
        {"match":{"author":"张三"}},{"match":{"title":"Elasticsearch"}}
      ],"filter":[
        {"range":
          {"word_count":{
              "gt":"0","lt":"3000"
            }
          }
        }
      ]
    }
  }
}

总结

以上所述是小编给大家介绍的SpringBoot整合Elasticsearch并实现CRUD操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对编程小技巧网站的支持!

您可能感兴趣的文章:

  • IDEA+maven+SpringBoot+JPA+Thymeleaf实现Crud及分页

(编辑:李大同)

【声明】本站内容均来自网络,其相关言论仅代表作者个人观点,不代表本站立场。若无意侵犯到您的权利,请及时与联系站长删除相关内容!

    推荐文章
      热点阅读