SpringBoot整合Elasticsearch并实现CRUD操作
作者:zxc123e 发布时间:2021-10-28 07:27:31
标签:spring,boot,crud
配置准备
在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", "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


猜你喜欢
- Java原生API并不支持为应用程序设置全局热键。要实现全局热键,需要用JNI方式实现,这就涉及到编写C/C++代码,这对于大多数不熟悉C/
- 相信对于手机的时间日期设置大家一定都不陌生吧,今天举一个关于时间日期设置的示例,其中有些许不完善之处,例如如何使设置的时间日期和手机系统同步
- 1.为什么要用thrift js C#? 1.1 首先,js 通过 thrift 访问C#,实际上是一种
- dataGridView动态绑定数据1.动态绑定DataTable数据DataGridView dgv = new DataGridView
- 介绍在 .NET4.0 之前,如果我们需要在多线程环境下使用 Dictionary 类,除了自己实现线程同步来保证线程安全外,我们没有其他选
- Android ListView填充数据的方法因为多人开发,为了是自己开发的模块方便融合到主框架中,同时也为了减小apk的大小,要求尽可能少
- 关键词IDEA 如何控制编辑左侧的功能图标 ICONIDEA 左侧的图标不见了怎么恢复1、操作步骤依次打开 File | Settings
- 抽象类1.引出抽象类向上转型带来的最大的好处就是参数统一化,使用共同的父类引用,就可以接收所有的子类实例。多态非常依赖方法覆写,但是子类可以
- 在多线程对一个整数进行自增操作时,需要用synchronized进行同步。然而,如果synchronized的对象选取的不合适的话,就无法实
- 本文实例讲述了Android获取手机屏幕大小的方法。分享给大家供大家参考,具体如下:这里主要用了三个对象TextView ,Button ,
- /// <summary>/// 获取数据缓存/// </summary>/// <param name=&q
- 需求:之前项目一个变动,需要对3张mysql数据库表数据进行清洗,3张表表名不同,表结构完全相同,需要对这3张表进行相同的增、改、查动作,一
- Java通过证书访问Https请求创建证书管理器类import java.io.FileInputStream;import java.se
- 新建控制台程序CAStudy.在应用程序中,添加books.xml,belowAvg.xsl 代码分别如下:books.xml<?xm
- spring cloud 配置中心native配置1、pom文件添加依赖<dependency> &l
- 一、线程同步概述前面的文章都是讲创建多线程来实现让我们能够更好的响应应用程序,然而当我们创建了多个线程时,就存在多个线程同时访问一个共享的资
- WebView设置WebViewClient的方法shouldOverrideUrlLoading:在web页面里单击链接的时候,会自动调用
- 最近有很多同学,竟然不知道如何使用Intellij IDEA打开Java项目并启动现在来讲一下,希望不要忘记了 1、打开IDEA开机页面 M
- (Memory Leak,内存泄漏)为什么会产生内存泄漏?当一个对象已经不需要再使用本该被回收时,另外一个正在使用的对象持有它的引用从而导致
- 具体实现方式不多说了,请看下文一、前言当下微信公众号几乎已经是每个公司必备的,但是大部分微信公众账号用户体验都欠佳,特别是涉及到用户绑定等,