SpringBoot整合Elasticsearch并实现CRUD操作

作者:zxc123e 时间:2021-10-28 07:27:31 

 配置准备

在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也开始支持函数式编程。

关于版本兼容

SpringBoot整合Elasticsearch并实现CRUD操作

配置访问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", "novel", 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", "novel", 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 = "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 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操作网站的支持!

来源:http://blog.csdn.net/zxc123e/article/details/79498113

标签:spring,boot,crud
0
投稿

猜你喜欢

  • android连续拖动导致挂起的解决方法

    2021-08-06 07:11:39
  • Android仿淘宝物流追踪的实例代码

    2021-08-19 22:57:23
  • Android 7.0系统webview 显示https页面空白处理方法

    2021-10-22 09:36:49
  • C#实现图片加相框的方法

    2022-06-02 13:52:28
  • 详解Spring Cloud中Hystrix的请求合并

    2022-07-06 14:53:06
  • Android点亮屏幕或屏幕解锁和锁定以及其他相关权限实现代码

    2021-12-21 16:44:26
  • WCF如何使用动态代理精简代码架构

    2023-09-17 16:25:42
  • c#动态编译执行对象方法示例 运用映射机制创建对象

    2023-11-19 22:39:32
  • 超详细讲解Java异常

    2023-10-02 07:30:16
  • C#中标准的IDispose模式代码详解

    2022-03-27 01:40:05
  • C语言 OutputDebugString与格式化输出函数OutputDebugPrintf案例详解

    2023-11-02 16:21:47
  • C++的函数与指针

    2022-12-20 14:08:15
  • Android三级缓存原理讲解

    2023-06-15 19:35:05
  • 浅谈Java中ThreadLocal内存泄露的原因及处理方式

    2021-06-12 21:08:37
  • springboot FeignClient注解及参数

    2021-07-09 21:59:07
  • C#实现读写ini文件类实例

    2023-09-06 18:47:00
  • java集合类HashMap源码解析

    2023-06-02 13:47:41
  • Java常用工具类—集合排序

    2022-07-08 08:05:39
  • C#灰度化图像的实例代码

    2023-07-14 07:35:34
  • Java NIO Path接口和Files类配合操作文件的实例

    2023-10-20 09:29:01
  • asp之家 软件编程 m.aspxhome.com