现在是2019年8月23日,elasticsearch 5.6.8可以正常使用.
大概讲一下集成过程中遇到的问题,方便有人需要的时候参考.
个人感觉elasticsearch的版本问题比较麻烦,它的版本更新太快,而spring boot 没有跟上,就导致在集成过程中总会有各种版本问题.在经历各种问题之后,总算将elasticsearch集成到了springboot上.
项目地址:https://github.com/wannengdek/SpringBoot-ElasticSearch
如果项目对您有所帮助,麻烦帮忙点亮小⭐⭐
版本
Windows版本: 5.6.8
spring-boot-starter-parent : 2.0.1.RELEASE
spring-boot-starter-data-elasticsearch : 2.0.1.RELEASE
spring-data-elasticsearch : 3.0.6.RELEASE
以下是版本截图
spring-boot-starter-data-elasticsearch :
<?xml version="1.0" encoding="UTF-8"?>
<project xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd" xmlns="http://maven.apache.org/POM/4.0.0"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance">
<modelVersion>4.0.0</modelVersion>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starters</artifactId>
<version>2.0.1.RELEASE</version>
</parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
<version>2.0.1.RELEASE</version>
<name>Spring Boot Data Elasticsearch Starter</name>
<description>Starter for using Elasticsearch search and analytics engine and Spring
Data Elasticsearch</description>
<url>https://projects.spring.io/spring-boot/#/spring-boot-parent/spring-boot-starters/spring-boot-starter-data-elasticsearch</url>
<organization>
<name>Pivotal Software, Inc.</name>
<url>https://spring.io</url>
</organization>
<licenses>
<license>
<name>Apache License, Version 2.0</name>
<url>http://www.apache.org/licenses/LICENSE-2.0</url>
</license>
</licenses>
<developers>
<developer>
<name>Pivotal</name>
<email>info@pivotal.io</email>
<organization>Pivotal Software, Inc.</organization>
<organizationUrl>http://www.spring.io</organizationUrl>
</developer>
</developers>
<scm>
<connection>scm:git:git://github.com/spring-projects/spring-boot.git/spring-boot-starters/spring-boot-starter-data-elasticsearch</connection>
<developerConnection>scm:git:ssh://git@github.com/spring-projects/spring-boot.git/spring-boot-starters/spring-boot-starter-data-elasticsearch</developerConnection>
<url>http://github.com/spring-projects/spring-boot/spring-boot-starters/spring-boot-starter-data-elasticsearch</url>
</scm>
<issueManagement>
<system>Github</system>
<url>https://github.com/spring-projects/spring-boot/issues</url>
</issueManagement>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
<version>2.0.1.RELEASE</version>
<scope>compile</scope>
</dependency>
<dependency>
<groupId>org.springframework.data</groupId>
<artifactId>spring-data-elasticsearch</artifactId>
<version>3.0.6.RELEASE</version>
<scope>compile</scope>
<exclusions>
<exclusion>
<artifactId>jcl-over-slf4j</artifactId>
<groupId>org.slf4j</groupId>
</exclusion>
<exclusion>
<artifactId>log4j-core</artifactId>
<groupId>org.apache.logging.log4j</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
</project>
在安装过程中如果遇到版本问题,可以去它的官网去查看对应得版本.
配置文件:
spring.data.elasticsearch.cluster-nodes=localhost:9300 # 设置连接超时时间 spring.data.elasticsearch.properties.transport.tcp.connect_timeout=120s # ELASTICSEARCH (ElasticsearchProperties) spring.data.elasticsearch.cluster-name=elasticsearch # Elasticsearch cluster name. spring.data.elasticsearch.repositories.enabled=true
测试
bean :
@Document(indexName = "blog",type = "blog")//elasticsearch的注解
public class EsBlog implements Serializable {
private static final long serialVersionUID = 4564729518133694581L;
@Id
private String id;
private String title;
private String summary;
private String content;
protected EsBlog() { // JPA 的规范要求无参构造函数;设为 protected 防止直接使用
}
public EsBlog(String title, String content,String summary) {
this.title = title;
this.content = content;
this.summary = summary ;
}
public String getId() {
return id;
}
public void setId(String id) {
this.id = id;
}
public String getTitle() {
return title;
}
public void setTitle(String title) {
this.title = title;
}
public String getContent() {
return content;
}
public void setContent(String content) {
this.content = content;
}
public String getSummary() {
return summary;
}
public void setSummary(String summary) {
this.summary = summary;
}
@Override
public String toString() {
return "EsBlog{" +
"id='" + id + '\'' +
", title='" + title + '\'' +
", summary='" + summary + '\'' +
", content='" + content + '\'' +
'}';
}
}
Repository:
public interface EsBlogRepository extends ElasticsearchRepository<EsBlog, String> {
Page<EsBlog> findDistinctEsBlogByTitleContainingOrSummaryContainingOrContentContaining(String title,String summary,String content,Pageable pageable);
}
它继承了es的接口,自动实现.
测试类
package dk.coding.blog;
import dk.coding.blog.bean.EsBlog;
import dk.coding.blog.repository.es.EsBlogRepository;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.boot.test.context.SpringBootTest;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.PageRequest;
import org.springframework.data.domain.Pageable;
import org.springframework.test.context.junit4.SpringRunner;
@RunWith(SpringRunner.class)
@SpringBootTest
public class BlogApplicationTests {
@Autowired
private EsBlogRepository esBlogRepository;
@Before
public void initData() {
// 清空所有
esBlogRepository.deleteAll();
esBlogRepository.save(new EsBlog("登鹳雀楼","王之涣的诗",
"白日依山尽,黄河入海流。欲穷千里目,更上一层楼。"));
esBlogRepository.save(new EsBlog("相思","王维的诗",
"红豆生南国,春来发几枝。愿君多采撷,此物最相思。"));
esBlogRepository.save(new EsBlog("静夜思","李白的诗",
"床前明月光,疑是地上霜。举头望明月,低头思故乡。"));
}
@Test
public void findDistinctEsBlogByTitleContainingOrSummaryContainingOrContentContaining() {
Pageable pageable = new PageRequest(0, 20);
String title = "思";
String summary = "相思";
String content = "相思";
Page<EsBlog> page = esBlogRepository.findDistinctEsBlogByTitleContainingOrSummaryContainingOrContentContaining(
title, summary, content, pageable);
System.out.println(page.getTotalElements());
for(EsBlog blog : page.getContent()) {
System.out.println(blog);
}
}
}
这个测试类的是要查找title中含有“思”字或者summary中含有“相思”或者content中含有“相思”的内容。理论上应该返回除了登鹳雀楼以外的两条数据。
结果:
EsBlogController
@RestController
@RequestMapping("/blogs")
public class EsBlogController {
@Autowired
private EsBlogRepository esBlogRepository;
@GetMapping
public List<EsBlog> list(@RequestParam("title") String title,
@RequestParam("summary") String summary,
@RequestParam("content") String content,
@RequestParam(value="pageIndex",defaultValue="0") int pageIndex,
@RequestParam(value="pageSize",defaultValue="10") int pageSize){
Pageable pageable = new PageRequest(pageIndex, pageSize);
//数据是在junit测试中初始化的
Page<EsBlog> page = esBlogRepository.findDistinctEsBlogByTitleContainingOrSummaryContainingOrContentContaining(
title, summary, content, pageable);
return page.getContent();
}
}
整合完成,此篇博客还有不少需要完善之处,我将渐渐完善.