Springboot2.x集成Elasticsearch实例讲解
文章目录
- 一、引用Elasticsearch依赖
- 二、配置文件修改
- 三、创建相关类
- 3.1 主类
- 3.2 实体类
- 四、运行
- 4.1、测试增加接口
- 4.2、测试获取接口
- 五、总结
一、引用Elasticsearch依赖
我们用的是Springboot2.2.5.RELEASE版本,下面我们引入了Elasticsearch的依赖。我们用了swagger,因此也加入的swagger的依赖。
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger2</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>io.springfox</groupId>
<artifactId>springfox-swagger-ui</artifactId>
<version>2.9.2</version>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>
二、配置文件修改
application.yml增加elasticsearch的地址及开启swagger配置
spring:
elasticsearch:
rest:
uris: http://192.168.22.2:9200
swagger:
enabled: true
jwt:
header: Authorization
三、创建相关类
3.1 主类
package com.test.es.estest;
import org.springframework.boot.SpringApplication;
import org.springframework.boot.autoconfigure.SpringBootApplication;
@SpringBootApplication
public class EstestApplication {
public static void main(String[] args) {
SpringApplication.run(EstestApplication.class, args);
}
}
3.2 实体类
package com.test.es.estest.entity;
import lombok.Data;
import lombok.NoArgsConstructor;
import lombok.experimental.Accessors;
import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;
import org.springframework.data.elasticsearch.annotations.FieldType;
@Data
@NoArgsConstructor
@Accessors(chain = true)
@Document(indexName = "ems",type = "_doc", shards = 1, replicas = 0)
public class DocBean {
@Id
private Long id;
@Field(type = FieldType.Keyword)
private String firstCode;
@Field(type = FieldType.Keyword)
private String secordCode;
@Field(type = FieldType.Text, analyzer = "ik_max_word")
private String content;
@Field(type = FieldType.Integer)
private Integer type;
public DocBean(Long id,String firstCode,String secordCode,String content,Integer type){
this.id=id;
this.firstCode=firstCode;
this.secordCode=secordCode;
this.content=content;
this.type=type;
}
}
indexName = “ems”,type = “_doc” :设置索引名称及类型。
前端返回数据结构:
package com.test.es.estest.entity;
/**
Title: PersonService
Description: 通用Rest请求返回结构
*- @author bingge
- @date 2020-2-20 下午7
30
@version V1.0
*/
public class Result {
//服务器返回的状态码(主要给程序员看)。例如 : 200 : 请求成功, 500 : 服务器内部错误,400 : 未知错误
private Integer code;//返回码 1:成功 10000:系统错误 10001:参数错误 …
private Integer status;// 服务器的错误信息 ,主要返回给用户看
private String msg;// 服务器返回的数据
private Object data;public Result() {
}//返回操作成功
public static Result ok() {return ok(null);
}
//返回操作成功
public static Result ok(Object data) {Result result = new Result();
result.setCode(200);
result.setStatus(1);
result.setMsg("请求成功");
result.setData(data);
return result;
}
//返回操作成功
public static Result error() {return error("请求失败");
}
//返回操作成功
public static Result error(Integer code, Integer status, String msg) {Result result = new Result();
result.setCode(code);
result.setStatus(status);
result.setMsg(msg);
return result;
}
//返回操作成功
public static Result error(String msg) {return error(500,0, msg);
}
//返回操作成功
public static Result error(ErrorStatus errorStatus) {return error(500,errorStatus.value(), errorStatus.getMessage());
}
public Integer getCode() {
return code;
}
public void setCode(Integer code) {
this.code = code;
}
public Integer getStatus() {
return status;
}
public void setStatus(Integer status) {
this.status = status;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Object getData() {
return data;
}
public void setData(Object data) {
this.data = data;
}
}
Swagger配置类:
package com.test.es.estest.config;
import com.google.common.base.Predicates;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import springfox.documentation.builders.ApiInfoBuilder;
import springfox.documentation.builders.ParameterBuilder;
import springfox.documentation.builders.PathSelectors;
import springfox.documentation.schema.ModelRef;
import springfox.documentation.service.ApiInfo;
import springfox.documentation.service.Parameter;
import springfox.documentation.spi.DocumentationType;
import springfox.documentation.spring.web.plugins.Docket;
import springfox.documentation.swagger2.annotations.EnableSwagger2;import java.util.ArrayList;
import java.util.List;/**
- api页面 /swagger-ui.html
* - @author jie
- @date 2018-11-23
*/
@Configuration
@EnableSwagger2
public class SwaggerConfig {@Value("${jwt.header}")
private String tokenHeader;
@Value("${swagger.enabled}")
private Boolean enabled;
@Bean
public Docket createRestApi() {
ParameterBuilder ticketPar = new ParameterBuilder();
List<Parameter> pars = new ArrayList<Parameter>();
ticketPar.name(tokenHeader).description("token")
.modelRef(new ModelRef("string"))
.parameterType("header")
.defaultValue("Bearer ")
.required(true)
.build();
pars.add(ticketPar.build());
System.out.println("----------SwaggerConfig end------------");
return new Docket(DocumentationType.SWAGGER_2)
.enable(enabled)
.apiInfo(apiInfo())
.select()
.paths(Predicates.not(PathSelectors.regex("/error.*")))
.build()
.globalOperationParameters(pars);
}
private ApiInfo apiInfo() {
return new ApiInfoBuilder()
.title("平台-接口文档")
.version("1.0")
.build();
}
}
- api页面 /swagger-ui.html
package com.test.es.estest.config;
import com.fasterxml.classmate.TypeResolver;
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import org.springframework.core.Ordered;
import springfox.documentation.schema.AlternateTypeRule;
import springfox.documentation.schema.AlternateTypeRuleConvention;
import java.awt.print.Pageable;
import java.util.List;
import static com.google.common.collect.Lists.newArrayList;
import static springfox.documentation.schema.AlternateTypeRules.newRule;
/**
* 将Pageable转换展示在swagger中
*/
@Configuration
public class SwaggerDataConfig {
@Bean
public AlternateTypeRuleConvention pageableConvention(final TypeResolver resolver) {
return new AlternateTypeRuleConvention() {
@Override
public int getOrder() {
return Ordered.HIGHEST_PRECEDENCE;
}
@Override
public List<AlternateTypeRule> rules() {
return newArrayList(newRule(resolver.resolve(Pageable.class), resolver.resolve(Page.class)));
}
};
}
@ApiModel
static class Page {
@ApiModelProperty("页码 (0..N)")
private Integer page;
@ApiModelProperty("每页显示的数目")
private Integer size;
@ApiModelProperty("以下列格式排序标准:property[,asc | desc]。 默认排序顺序为升序。 支持多种排序条件:如:id,asc")
private List<String> sort;
public Integer getPage() {
return page;
}
public void setPage(Integer page) {
this.page = page;
}
public Integer getSize() {
return size;
}
public void setSize(Integer size) {
this.size = size;
}
public List<String> getSort() {
return sort;
}
public void setSort(List<String> sort) {
this.sort = sort;
}
}
}
dac层接口类:
package com.test.es.estest.dao;
import com.test.es.estest.entity.DocBean;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.annotations.Query;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
public interface ElasticRepository extends ElasticsearchRepository{ //默认的注释
//@Query("{\"bool\" : {\"must\" : {\"field\" : {\"content\" : \"?\"}}}}")
Page<DocBean> findByContent(String content, Pageable pageable);
@Query("{\"bool\" : {\"must\" : {\"field\" : {\"firstCode.keyword\" : \"?\"}}}}")
Page<DocBean> findByFirstCode(String firstCode, Pageable pageable);
@Query("{\"bool\" : {\"must\" : {\"field\" : {\"secordCode.keyword\" : \"?\"}}}}")
Page<DocBean> findBySecordCode(String secordCode, Pageable pageable);
}
service层接口类及实现类:
package com.test.es.estest.service;
import com.test.es.estest.dao.ElasticRepository;
import com.test.es.estest.entity.DocBean;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.core.ElasticsearchRestTemplate;
import org.springframework.stereotype.Service;
import java.util.Iterator;
import java.util.List;@Service(“elasticService”)
public class ElasticServiceImpl implements IElasticService {@Autowired
private ElasticsearchRestTemplate elasticsearchTemplate;
@Autowired
private ElasticRepository elasticRepository;
private Pageable pageable = PageRequest.of(0,10);
@Override
public void createIndex() {
elasticsearchTemplate.createIndex(DocBean.class);
}
@Override
public void deleteIndex(String index) {
elasticsearchTemplate.deleteIndex(index);
}
@Override
public void save(DocBean docBean) {
elasticRepository.save(docBean);
}
@Override
public void saveAll(List<DocBean> list) {
elasticRepository.saveAll(list);
}
@Override
public Iterator<DocBean> findAll() {
return elasticRepository.findAll().iterator();
}
@Override
public Page<DocBean> findByContent(String content) {
return elasticRepository.findByContent(content,pageable);
}
@Override
public Page<DocBean> findByFirstCode(String firstCode) {
return elasticRepository.findByFirstCode(firstCode,pageable);
}
@Override
public Page<DocBean> findBySecordCode(String secordCode) {
return elasticRepository.findBySecordCode(secordCode,pageable);
}
@Override
public Page<DocBean> query(String key) {
return elasticRepository.findByContent(key,pageable);
}
}
package com.test.es.estest.service;
import com.test.es.estest.entity.DocBean;
import org.springframework.data.domain.Page;
import java.util.Iterator;
import java.util.List;
public interface IElasticService {
void createIndex();
void deleteIndex(String index);
void save(DocBean docBean);
void saveAll(List<DocBean> list);
Iterator<DocBean> findAll();
Page<DocBean> findByContent(String content);
Page<DocBean> findByFirstCode(String firstCode);
Page<DocBean> findBySecordCode(String secordCode);
Page<DocBean> query(String key);
}
Controller类:
package com.test.es.estest.controller;
import com.test.es.estest.dao.ElasticRepository;
import com.test.es.estest.entity.DocBean;
import com.test.es.estest.entity.Result;
import com.test.es.estest.service.IElasticService;
import io.swagger.annotations.;
import lombok.extern.slf4j.Slf4j;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.RangeQueryBuilder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import java.util.;/**
Title: TestController2
Description: 测试Memcache
*- @author binge
- @date 2020-2-20 下午7
30
@version V1.0
*/
@RestController
@Slf4j
@Api(tags=”elasticsearch性能测试”)
public class TestController {
@Autowired
private IElasticService elasticService;
@Autowired
private ElasticRepository elasticRepository;
@RequestMapping(“/put”)
@ApiOperation(value=”批量数据插入es数据库”,notes=”批量数据插入es数据库”)
@ApiImplicitParams({@ApiImplicitParam(name = "index", value = "索引", required = true, dataType = "String", paramType="query"),
@ApiImplicitParam(name = "type", value = "类型", required = true, dataType = "String", paramType="query"),
@ApiImplicitParam(name = "ids", value = "id开始序号", required = true, dataType = "Long", paramType="query"),
@ApiImplicitParam(name = "ide", value = "id结束序号", required = true, dataType = "Long", paramType="query")
})
public Result putEsdata(String index,String type, Long ids, Long ide) throws InterruptedException {elasticService.createIndex();
List<DocBean> list =new ArrayList<>();
for (Long i=ids; i<ide; ++i){
list.add(new DocBean(i,"XX3713"+i,"XX01"+i,"xxxxxx"+i,1));
}
elasticService.saveAll(list);
return Result.ok();
}
@RequestMapping(“/get”)
@ApiOperation(value=”根据id范围获取数据”,notes=”根据id范围获取数据”)
@ApiImplicitParams({@ApiImplicitParam(name = "s", value = "起始ID", required = true, dataType = "Int", paramType="query"),
@ApiImplicitParam(name = "e", value = "终止ID", required = true, dataType = "Int", paramType="query")
})
public Result getEsdata(int s, int e) throws InterruptedException {/**
* 创建查询体
*/
BoolQueryBuilder builder = QueryBuilders.boolQuery();
/**
* 设置聚合条件
*/
RangeQueryBuilder query = QueryBuilders.rangeQuery("id").from(s).to(e);
/**
* 将聚合条件设置入查询体之中
*/
builder.must(query);
Iterable<DocBean> data = elasticRepository.search(builder);
return Result.ok(data);
}
}
四、运行
运行后,访问:http://localhost:8080/swagger-ui.html
4.1、测试增加接口
执行后,大概1s左右,写入10000条数据。
4.2、测试获取接口
执行后的结果截图如下:
Response body中的内容即为查询结果。
五、总结
初步进行了Elasticsearch和Springboot2.x及集成操作,对Elasticsearch的复合查询没有过多介绍,后续会有专门章节进行详解。
还没有评论,来说两句吧...