SpringBoot 调用Elasticsearch

本文介绍如何在Spring Boot项目中集成Elasticsearch,并通过示例代码演示了基本的CRUD操作及复合查询。

1、项目配置

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>

	<groupId>cn.edu.shu</groupId>
	<artifactId>ces_chenjie</artifactId>
	<version>0.0.1-SNAPSHOT</version>
	<packaging>jar</packaging>

	<name>ces_chenjie</name>
	<description>Demo project for Spring Boot</description>

	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.7.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>

	<properties>
		<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
		<project.reporting.outputEncoding>UTF-8</project.reporting.outputEncoding>
		<java.version>1.8</java.version>
		<elasticsearch.version>5.6.3</elasticsearch.version>
	</properties>


	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
			<scope>test</scope>
		</dependency>

		<dependency>
			<groupId>org.elasticsearch.client</groupId>
			<artifactId>transport</artifactId>
			<version>5.6.3</version>
		</dependency>

		<dependency>
			<groupId>org.apache.logging.log4j</groupId>
			<artifactId>log4j-core</artifactId>
			<version>2.7</version>
		</dependency>

	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>


</project>

2、新建配置类


package cn.edu.shu.ces_chenjie;

import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.transport.client.PreBuiltTransportClient;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import java.net.InetAddress;
import java.net.UnknownHostException;

@Configuration
public class MyConf {
    @Bean
    public TransportClient client() throws UnknownHostException {
        InetSocketTransportAddress node1 = new InetSocketTransportAddress(InetAddress.getByName("localhost"),
                9300
                );
        //连接localhost的9300端口,即Elasticsearch的master
        Settings settings = Settings.builder().
                put("cluster.name","chenjie")//定义集群的名字,应该与Elasticsearch的master的配置保持一致
                .build();

        TransportClient client = new PreBuiltTransportClient(settings);//使用设置建立客户端
        client.addTransportAddress(node1);
        return client;
    }
}


3、新建Controller

package cn.edu.shu.ces_chenjie;

import org.elasticsearch.action.delete.DeleteResponse;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.action.update.UpdateRequest;
import org.elasticsearch.action.update.UpdateResponse;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.xcontent.XContentBuilder;
import org.elasticsearch.common.xcontent.XContentFactory;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.elasticsearch.search.SearchHit;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
import org.springframework.format.annotation.DateTimeFormat;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import java.io.IOException;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Map;

@SpringBootApplication
@RestController
public class CesChenjieApplication {
	@Autowired
	private TransportClient client;//elasticsearch客户端

	@RequestMapping("/")
	public String index(){
		return "index";
	}

	/***
	 * GET localhost:8080/book/novel?id=1
	 * @param id 书籍ID
	 * @return 书籍信息
	 */
	@GetMapping("/book/novel")
	@ResponseBody
	public ResponseEntity getBookNovel(@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);
	}

	/**
	 * 插入一条数据
	 * POST localhost:8080/book/novel
	 * @param title 标题 
	 * @param author 作者
	 * @param word_count 字数
	 * @param publish_date 出版日期
	 * @return 成功返回ID,失败返回错误码
	 */
	@PostMapping("/book/novel")
	public ResponseEntity addBookNovel(
			@RequestParam(name="title",defaultValue = "")String title,
			@RequestParam(name="author",defaultValue = "")String author,
			@RequestParam(name="word_count",defaultValue = "")Integer word_count,
			@RequestParam(name="publish_date",defaultValue = "")
					@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss")
					Date publish_date){

		try {
			XContentBuilder content =  XContentFactory.jsonBuilder()
                    .startObject()
                    .field("title",title)
                    .field("author",author)
                    .field("word_count",word_count)
                    .field("publish_date",publish_date.getTime())
                    .endObject();
			IndexResponse response = this.client.prepareIndex("book","novel")
					.setSource(content)
					.get();
			return new ResponseEntity(response.getId(), HttpStatus.OK);
		} catch (IOException e) {
			e.printStackTrace();
			return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
		}

	}

	/***
	 * 通过DELETE  删除
	 * @param id 书籍
	 * @return
	 */
	@DeleteMapping("/book/novel")
	public ResponseEntity delBookNovel(@RequestParam(name="id",defaultValue = "")String id){
		if(id.isEmpty()){
			return new ResponseEntity(HttpStatus.NOT_FOUND);
		}
		DeleteResponse response = client.prepareDelete("book","novel",id).get();

		return new ResponseEntity(response.getResult().toString(), HttpStatus.OK);
	}

	/***
	 * 通过PUT修改
	 * @param id 书籍
	 * @param title
	 * @param author
	 * @param word_count
	 * @param publish_date
	 * @return
	 */
	@PutMapping("/book/novel")
	public ResponseEntity updateBookNovel(
			@RequestParam(name="id",defaultValue = "")String id,
			@RequestParam(name="title",required = false)String title,
			@RequestParam(name="author",required = false)String author,
			@RequestParam(name="word_count",required = false)Integer word_count,
			@RequestParam(name="publish_date",required = false)
				@DateTimeFormat(pattern = "yyyy-MM-dd HH:mm:ss") Date publish_date){
		if(id.isEmpty()){
			return new ResponseEntity(HttpStatus.NOT_FOUND);
		}
		UpdateRequest update = new UpdateRequest("book","novel",id);
		try {
			XContentBuilder content =  XContentFactory.jsonBuilder()
                    .startObject();
			if(title != null)
				content.field("title",title);
			if(author != null)
				content.field("author",author);
			if(word_count != null)
				content.field("word_count",word_count);
			if(publish_date != null)
				content.field("publish_date",publish_date.getTime());
			content.endObject();
			update.doc(content);

		} catch (IOException e) {
			e.printStackTrace();
			return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
		}
		try {
			UpdateResponse response =  this.client.update(update).get();
			return new ResponseEntity(response.getResult().toString(),HttpStatus.OK);
		} catch (Exception e) {
			e.printStackTrace();
			return new ResponseEntity(HttpStatus.INTERNAL_SERVER_ERROR);
		}
	}

	/***
	 * 通过POST进行复合查询
	 * @param title
	 * @param author
	 * @param gtWordCount
	 * @param ltWordCount
	 * @return
	 */
	@PostMapping("book/novel/query")
	public ResponseEntity query(
			@RequestParam(name="title",required = false)String title,
			@RequestParam(name="author",required = false)String author,
			@RequestParam(name="gt_word_count",defaultValue = "0")Integer gtWordCount,
			@RequestParam(name="lt_word_count",defaultValue = "0",required = false)Integer ltWordCount
			){
		BoolQueryBuilder boolQuery = QueryBuilders.boolQuery();
		if(author != null){
			boolQuery.must(QueryBuilders.matchQuery("author",author));
		}
		if(title != null){
			boolQuery.must(QueryBuilders.matchQuery("title",title));
		}
		RangeQueryBuilder range = QueryBuilders.rangeQuery("word_count");
		if(ltWordCount != null && ltWordCount >0){
			range.to(ltWordCount);
		}

		boolQuery.filter(range);

		SearchRequestBuilder builder = this.client.prepareSearch("book")
				.setTypes("novel")
				.setSearchType(SearchType.DFS_QUERY_THEN_FETCH)
				.setQuery(boolQuery)
				.setFrom(0)
				.setSize(10);
		System.out.println(builder);
		SearchResponse response = builder.get();
		List<Map<String,Object>> result = new ArrayList<Map<String,Object>>();
		for(SearchHit hit:response.getHits()){
			result.add(hit.getSource());
		}
		return new ResponseEntity(result,HttpStatus.OK);
	}

	public static void main(String[] args) {
		SpringApplication.run(CesChenjieApplication.class, args);
	}
}


4、使用POSTMAN测试








评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值