还是跟之前一样,用gradle+springboot+ElasticSearchl来实现一个小实例 也有用到spring data
因为用到ElasticSearch,所以要安装 启动,linux下的安装不做演示。window下启动就是在bin文件夹下双击elasticsearch.bat就可以了
修改build.gradle
// 添加 Spring Data Elasticsearch 的依赖
compile(‘org.springframework.boot:spring-boot-starter-data-elasticsearch’)
// 添加 JNA 的依赖
compile(‘net.java.dev.jna:jna:4.3.0’)
// buildscript 代码块中脚本优先执行
buildscript {
// ext 用于定义动态属
ext {
springBootVersion = '1.5.2.RELEASE'
}
// 自定义 Elasticsearch 的版本
//ext['elasticsearch.version'] = '5.2.2'
// 使用了 Maven 的中央仓库(你也可以指定其他仓库)
repositories {
//mavenCentral()
maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
}
// 依赖关系
dependencies {
// classpath 声明说明了在执行其余的脚本时,ClassLoader 可以使用这些依赖项
classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}")
}
}
// 使用插件
apply plugin: 'java'
apply plugin: 'eclipse'
apply plugin: 'org.springframework.boot'
// 打包的类型为 jar,并指定了生成的打包的文件名称和版本
jar {
baseName = 'elasticsearch-in-action'
version = '1.0.0'
}
// 指定编译 .java 文件的 JDK 版本
sourceCompatibility = 1.8
// 默认使用了 Maven 的中央仓库。这里改用自定义的镜像库
repositories {
//mavenCentral()
maven {
url 'http://maven.aliyun.com/nexus/content/groups/public/'
}
}
// 依赖关系
dependencies {
// 该依赖对于编译发行是必须的
compile('org.springframework.boot:spring-boot-starter-web')
// 添加 Spring Data Elasticsearch 的依赖
compile('org.springframework.boot:spring-boot-starter-data-elasticsearch')
// 添加 JNA 的依赖
compile('net.java.dev.jna:jna:4.3.0')
// 该依赖对于编译测试是必须的,默认包含编译产品依赖和编译时依
testCompile('org.springframework.boot:spring-boot-starter-test')
}
照常,可以的话在cmd命令下用gradlew bootRun运行
打开浏览器浏览localhost:8080是否可以跳出一个页面,只要能跳出就可以了
修改application.properties
# ElasticSearch服务地址
spring.data.elasticsearch.cluster-nodes=localhost:9300
# 设置连接超时时间
spring.data.elasticsearch.properties.transport.tcp.connect_timeout=120s
创建一个文档实体 Blog.java
@Document(indexName = "blog", type = "blog", shards = 1, replicas = 0, refreshInterval = "-1") //标识是文档
//@XmlRootElement // MediaType 转为 XML
public class Blog implements Serializable {
private static final long serialVersionUID = 1L;
@Id // 主键
private String id; // 用户的唯一标识
private String title;
private String content;
protected Blog() { // spring data JPA 的规范要求无参构造函数;设为 protected 防止直接使用
}
public Blog(String name, String content) {
this.title = name;
this.content = content;
}
public Blog(String id, String name, String content) {
this.id = id;
this.title = name;
this.content = content;
}
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;
}
@Override
public String toString() {
return String.format(
"User[id='%s', title='%s', content='%s']",
id, title, content);
}
}
BlogRepository.java
public interface BlogRepository extends ElasticsearchRepository<Blog, String> {
/**
* 根据用户名分页查询用户列表 模糊查询
*
*/
Page<Blog> findByTitleLikeOrContentLike(String title, String content, Pageable pageable);
}
写一个测试类
BlogRepositoryTest.java
@RunWith(SpringRunner.class)
@SpringBootTest //传入上下文
public class BlogRepositoryTest {
@Autowired
private BlogRepository blogRepository;
@Before //junit的方法 在Test执行之前执行
public void initRepositoryData(){
//清楚所有数据
blogRepository.deleteAll();
}
@Test
public void testFindByTitleLikeOrContentLike() {
blogRepository.save(new Blog("1","跟你谈谈安装 Elasticsearch",
"关于如何来安装 Elasticsearch,这个请看我的博客 https://waylau.com"));
blogRepository.save(new Blog("2","跟你谈谈 Elasticsearch 的几个用法",
"关于如何来用 Elasticsearch,还是得看我的博客 https://waylau.com,妹")); // 关键字"妹"
blogRepository.save(new Blog("3","和你一起学 Elasticsearch",
"如何来学习 Elasticsearch,最终看我的博客 https://waylau.com,酒")); // 关键字"酒"
blogRepository.save(new Blog("4","03-05 用大白话聊聊分布式系统",
"一提起“分布式系统”,大家的第一感觉就是好高大上啊,深不可测"));
blogRepository.save(new Blog("5","02-19 Thymeleaf 3 引入了新的解析系统",
"如果你的代码使用了 HTML5 的标准,而Thymeleaf 版本来停留在 2.x ,那么如果没有把闭合"));
blogRepository.save(new Blog("6","02-19 使用 GFM Eclipse 插件时,不在项目里面生成 HTML 文件",
"GFM 是 GitHub Flavored Markdown Viewer 的简称,是一款对 GitHub 友好的 Markdown 编辑器 。"));
Pageable pageable = new PageRequest(0, 20);
Page<Blog> page = blogRepository.findByTitleLikeOrContentLike("妹", "酒", pageable);
assertThat(page.getTotalElements()).isEqualTo(2);
}
}
在启动测试之前,记得启动elasticsearch,否则连接报错
写控制层 BlogController.java
@RestController
@RequestMapping("/blogs")
public class BlogController {
@Autowired
private BlogRepository blogRepository;
@GetMapping
public List<Blog> list(@RequestParam(value="title",required=false,defaultValue="") String title,
@RequestParam(value="content",required=false,defaultValue="") String content,
@RequestParam(value="pageIndex",required=false,defaultValue="0") int pageIndex,
@RequestParam(value="pageSize",required=false,defaultValue="10") int pageSize) {
// 数据在 Test 里面先初始化了,这里只管取数据
Pageable pageable = new PageRequest(pageIndex, pageSize);
Page<Blog> page = blogRepository.findByTitleLikeOrContentLike(title, content, pageable);
return page.getContent();
}
}
清除之前elasticsearch的数据,在安装目录下的data文件夹下 删除elasticsearch这个文件
再次启动/bin/elasticsearch.bat 可以先运行项目,在运行上面的测试类 这样就有数据了