配置准备
在build.gradle文件中添加如下依赖:
1
2
3
4
5
|
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。
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
|
@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。
1
2
3
4
5
|
@RestController
public class ElasticSearchController {
@Autowired
TransportClient client;
}
|
在控制器中添加增删查改方法
增加操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
|
@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);
}
}
|
删除操作
1
2
3
4
5
6
|
@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);
}
|
查找操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
|
@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);
}
|
更新操作
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
|
@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);
}
}
|
复合查找
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
|
@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:
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
|
{
"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