ElasticSearch与springboot整合

还是跟之前一样,用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 可以先运行项目,在运行上面的测试类 这样就有数据了

猜你喜欢

转载自blog.csdn.net/guo_binglo/article/details/80466364