SpringBoot整合Elasticsearch并实现CRUD操作

网友投稿 289 2023-02-13


SpringBoot整合Elasticsearch并实现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(namehttp:// = "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> 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操作,希望对大家有所帮助,如果大家有任何疑问请给我留言,会及时回复大家的。在此也非常感谢大家对我们网站的支持!


版权声明:本文内容由网络用户投稿,版权归原作者所有,本站不拥有其著作权,亦不承担相应法律责任。如果您发现本站中有涉嫌抄袭或描述失实的内容,请联系我们jiasou666@gmail.com 处理,核实后本网站将在24小时内删除侵权内容。

上一篇:在vue中使用css modules替代scroped的方法
下一篇:Spring Boot启动banner定制的步骤详解
相关文章

 发表评论

暂时没有评论,来抢沙发吧~