这篇接着上一篇(https://blog.csdn.net/Ocean111best/article/details/85948948),本来准备上一篇写完,但是发现太多,故再写一篇。
一、本次搭建中,首先需要确定 Springboot 版本和 ElasticSearch 版本。由于之前跟着网上做的例子是 Springboot 1.5.17,故此次也用的 Springboot 1.5.17(尝试过用 Springboot 2.0,但是发现有很多问题,有很多 jar 包没有成功引入);ES 选择 5.6.1,尝试过选择6.5.0 版本,但是发现 es 配置文件跟原先不一样了,写了好几种都不行,无奈换回来 5.6.1 。Springboot 和 ES 版本如下图设置:
org.springframework.boot
spring-boot-starter-parent
1.5.17.RELEASE
UTF-8
UTF-8
1.8
5.6.1
二、由于之后高级搜索中,需要精确搜索,需要用到 elasticsearch-sql 才可以,且 elasticsearch-sql 版本需要和 elasticsearch 版本一致,但是在 Maven Repository 发现没有 elasticsearch-sql-5.6.1.0,因此无奈下载一个到本地,然后如何在 maven 的配置文件 pom.xml 中引入本地的 jar 包搞了很久(虽然网上很多教程,但是都没安装成功,后来问了一个大神才知道的),将 elasticsearch-sql-5.6.1.0.jar 放到 src/main/resources 目录下,然后在 pom.xml 文件中按如下方法引入:
org.nlpcn
elasticsearch-sql
5.6.1.0
system
${project.basedir}/src/main/resources/elasticsearch-sql-5.6.1.0.jar
三、在 Springboot 中,前端说要通过 json 格式的参数传过来,但是之前测试做的都不是用 json 格式,于是又得改为接收 json 格式的参数,这个地方不知道为啥,我直接改了好几次都不行,请一个大神远程操作一下就出来了,而且他试的方法我之前还试过,是在每个 Controller 层中每个请求的方法中,配置为 Json 格式的,如下图所示:
@RequestMapping(value = "yearbook/search",method = RequestMethod.POST,produces = { MediaType.APPLICATION_JSON_VALUE },consumes = MediaType.APPLICATION_JSON_VALUE)
public ResponseEntity query(@RequestBody YearbookSearch yearbookSearch){
List result = yearbookService.query(yearbookSearch);
return new ResponseEntity(result, HttpStatus.OK);
}
四、其中为了使用 swagger 统一管理 API,又配置了下 swagger,如下所示
则在每个 Controller 层中每个请求的方法中,进行如下的设置,如下所示:
五、其中为了统一管理,对请求的参数和返回的参数设置为统一的参数结构体,如下图所示:
/**
* 统计年鉴请求参数结构体
*/
public class YearbookSearch {
public String keywords;
public String year;
public String citytr;
public String index_name;
private int start = 0;
private int size = 20000;
public int getStart() {
return start > 0 ? start : 0;
}
public void setStart(int start) {
this.start = start;
}
//分页
public int getSize() {
if (this.size < 1) {
return 5;
} else if (this.size > 500) {
return 500;
} else {
return this.size;
}
}
public String getYear() {
return year;
}
public void setYear(String year) {
this.year = year;
}
public String getCitytr() {
return citytr;
}
public void setCitytr(String citytr) {
this.citytr = citytr;
}
public String getIndex_name() {
return index_name;
}
public void setIndex_name(String index_name) {
this.index_name = index_name;
}
public void setSize(int size) {
this.size = size;
}
public String getKeywords() {
return keywords;
}
public void setKeywords(String keywords) {
this.keywords = keywords;
}
@Override
public String toString() {
return "YearbookSearch {" +
", year='" + year + '\'' +
", citytr='" + citytr + '\'' +
", index_name='" + index_name + '\'' +
", keywords='" + keywords + '\'' +
'}';
}
}
六、需要设置索引关键字的统一定义,在下面 elasearch 查询匹配时会用到,如下所示:
/**
* 索引关键字统一定义
*/
public class YearbookIndexKey {
public static final String BOOK_ID = "id";
public static final String CITYTR = "citytr"; //keywords
public static final String CLASSES = "classes";
public static final String CODE = "code"; //keywords
public static final String COUNTYTR = "countytr";
public static final String DISTINCT = "distinct";
public static final String FROM = "from";
public static final String MD5 = "MD5";
public static final String INDEX_NAME = "index_name"; //keywords
public static final String PROVINCETR = "provincetr"; //keywords
public static final String STATISTIC_NUM = "statistic_num"; //keywords
public static final String TAG = "tag"; //keywords
public static final String UNIT = "unit"; //keywords
public static final String YEAR = "year"; //keywords
}
七、刚开始设置时,需要设置允许跨域访问,不然前端无法访问(以前没有做过前后端分离的故不太清楚),如下图所示:
/**
* 提供跨域处理
*/
@Configuration
public class CORSConfiguration extends WebMvcConfigurerAdapter{
@Override
public void addCorsMappings(CorsRegistry registry){
registry.addMapping("/**");
}
}