专栏首页复盘总结文章集合SpringBoot 整合 elasticsearch 实例

SpringBoot 整合 elasticsearch 实例

一、下载 并启动 elasticsearch

下载地址:https://www.elastic.co/downloads/past-releases

选择一个版本,下载

博主这里测试使用的是 2.4.4

下载方式可以选择 ZIP 包

启动的话,windows 和 mac 有些细微区别

windows :进入文件目录下的 bin,然后点击 elasticsearch.bat 即可

mac:在终端执行命令 bin/elasticsearch

二、配置 Maven

<!-- Spring Boot Elasticsearch 依赖 -->
<dependency>
   <groupId>org.springframework.boot</groupId>
   <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
</dependency>


<properties>
   <elasticsearch.version>2.4.4</elasticsearch.version>
</properties>

添加 spring-boot-starter-data-elasticsearch 依赖,并设置 elasticsearch 版本为 2.4.4

ES 和 SpirngBoot 版本参考:

https://github.com/spring-projects/spring-data-elasticsearch/wiki/Spring-Data-Elasticsearch---Spring-Boot---version-matrix

三、修改 application.properties

#Project
server.port=8080
debug=true
server.context-path=/chuyun
# DataSource
spring.datasource.driver-class-name=com.mysql.jdbc.Driver
spring.datasource.username=root
spring.datasource.password=123456
spring.datasource.url=jdbc:mysql://localhost:3306/chuyun?characterEncodeing=utf-8&useSSL=false
# JPA
spring.jpa.show-sql=true
spring.jpa.hibernate.ddl-auto=update
#Thymeleaf
spring.thymeleaf.encoding=UTF-8
spring.thymeleaf.cache=false
spring.thymeleaf.cache-period=0
spring.template.cache=false
spring.thymeleaf.mode=HTML5
spring.thymeleaf.prefix=classpath:templates/
spring.thymeleaf.suffix=.html
#Elasticsearch
spring.data.elasticsearch.cluster-nodes=localhost:9300
spring.data.elasticsearch.properties.transport.tcp.connect_timeout=120s

主要是添加最后面两条

四、创建 ES Bean 和 Repository

Article.java

package com.liuyanzhao.chuyun.domain.es;
import org.springframework.data.elasticsearch.annotations.Document;
import javax.persistence.Id;
import java.util.Date;
/**
 * @author 言曌
 * @date 2018/1/22 下午4:45
 */
@Document(indexName="chuyun",type="article",indexStoreType="fs",shards=5,replicas=1,refreshInterval="-1")
public class Article {
    //文章ID,这里必须为 id
    @Id
    private Long id;
    //标题
    private String title;
    //内容
    private String content;
    //浏览量
    private Integer viewCount;
    //发布时间
    private Date createTime;
    //更新时间
    private Date updateTime;
    public Article() {
    }
    public Long getId() {
        return id;
    }
    public void setId(Long 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 Integer getViewCount() {
        return viewCount;
    }
    public void setViewCount(Integer viewCount) {
        this.viewCount = viewCount;
    }
    public Date getCreateTime() {
        return createTime;
    }
    public void setCreateTime(Date createTime) {
        this.createTime = createTime;
    }
    public Date getUpdateTime() {
        return updateTime;
    }
    public void setUpdateTime(Date updateTime) {
        this.updateTime = updateTime;
    }
    @Override
    public String toString() {
        return "Article{" +
                "id=" + id +
                ", title='" + title + '\'' +
                ", content='" + content + '\'' +
                ", viewCount=" + viewCount +
                ", createTime=" + createTime +
                ", updateTime=" + updateTime +
                '}';
    }
}

ArticleRepository.java

package com.liuyanzhao.chuyun.repository.es;
import com.liuyanzhao.chuyun.domain.es.Article;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
/**
 * @author 言曌
 * @date 2018/1/22 下午5:05
 */
public interface ArticleRepository extends ElasticsearchRepository<Article, Long> {
    Page<Article> findDistinctByTitleContainingOrContentContaining(String title, String content, Pageable pageable);
}

五、创建测试类

ArticleRepositoryTest.java

package com.liuyanzhao.chuyun.repository.es;
import com.liuyanzhao.chuyun.domain.es.Article;
import com.liuyanzhao.chuyun.entity.User;
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;
import java.util.Date;
/**
 * @author 言曌
 * @date 2018/1/21 下午5:03
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class ArticleRepositoryTest {
    @Autowired
    private ArticleRepository articleRepository;
    @Before
    public void initRepositoryData() {
        //清除所有数据
        articleRepository.deleteAll();
        Article article = new Article();
        article.setId((long) 1);
        article.setTitle("《蝶恋花》");
        article.setContent("槛菊愁烟兰泣露,罗幕轻寒,燕子双飞去。明月不谙离恨苦,斜光到晓穿朱户。昨夜西风凋碧树,独上高楼,望尽天涯路。欲寄彩笺兼尺素,山长水阔知何处?");
        article.setCreateTime(new Date());
        article.setUpdateTime(new Date());
        article.setViewCount(678);
        articleRepository.save(article);
        Article article2 = new Article();
        article2.setId((long) 2);
        article2.setTitle("《蝶恋花》");
        article2.setContent("伫倚危楼风细细,望极春愁,黯黯生天际。草色烟光残照里,无言谁会凭阑意。拟把疏狂图一醉,对酒当歌,强乐还无味。衣带渐宽终不悔,为伊消得人憔悴。");
        article2.setCreateTime(new Date());
        article2.setUpdateTime(new Date());
        article.setViewCount(367);
        articleRepository.save(article2);
        Article article3 = new Article();
        article3.setId((long) 3);
        article3.setTitle("《青玉案·元夕》");
        article3.setContent("东风夜放花千树,更吹落,星如雨。宝马雕车香满路。凤箫声动,玉壶光转,一夜鱼龙舞。蛾儿雪柳黄金缕,笑语盈盈暗香去。众里寻他千百度,蓦然回首,那人却在,灯火阑珊处。");
        article3.setCreateTime(new Date());
        article3.setUpdateTime(new Date());
        article3.setViewCount(786);
        articleRepository.save(article3);
    }
    @Test
    public void findDistinctByTitleContainingOrContentContainingTest() throws Exception {
        Pageable pageable = new PageRequest(0,20);
        String title = "我爱罗琪";
        String content = "花千树";
        Page<Article> page = articleRepository.findDistinctByTitleContainingOrContentContaining(title, content, pageable);
        System.out.println(page);
        System.out.println("---start---");
        for(Article article : page.getContent()) {
            System.out.println(article.toString());
        }
        System.out.println("---end---");
    }
}

运行 @Test 注解的方法

根据 title 和 content 内容查到一条数据

修改 title 和 content

String title = "蝶恋";
String content = "东风";

查到三条数据

六、访问 http://localhost:9200/_plugin/head/

因为上一篇文章中,我们讲了装一个 head 插件,现在我们就能看到里面的数据了(多余的数据是之前测试的)

七、新建 Controller 类

ArticleController.java

package com.liuyanzhao.chuyun.controller;
import com.liuyanzhao.chuyun.domain.es.Article;
import com.liuyanzhao.chuyun.repository.es.ArticleRepository;
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.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;
import java.util.List;
/**
 * @author 言曌
 * @date 2018/1/22 下午9:07
 */
@RestController
@RequestMapping("/article")
public class ArticleController {
    @Autowired
    private ArticleRepository ArticleRepository;
    @RequestMapping("")
    public List<Article> list(@RequestParam(value = "title", required = false) String title,
                                @RequestParam(value = "content", required = false) String content,
                                @RequestParam(value = "pageIndex", defaultValue = "0") int pageIndex,
                                @RequestParam(value = "pageSize", defaultValue = "10") int pageSize) {
        Pageable pageable = new PageRequest(pageIndex, pageSize);
        Page<Article> page = ArticleRepository.findDistinctByTitleContainingOrContentContaining(title, content, pageable);
        return page.getContent();
    }
}

因为之前在 测试类 里已经给 elasticsearch 添加了数据

所有现在可以在浏览器上访问:

http://localhost:8080/chuyun/article?title=浪淘沙&content=伊人

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Mysql几种索引类型的区别及适用情况

    即为全文索引,目前只有MyISAM引擎支持。其可以在CREATE TABLE ,ALTER TABLE ,CREATE INDEX 使用,不过目前只有 CHAR...

    ZhangXianSheng
  • Springboot集成Swagger操作步骤

      随着互联网技术的发展,现在的网站架构基本都由原来的后端渲染,变成了:前端渲染、先后端分离的形态,而且前端技术和后端技术在各自的道路上越走越远。 前端和后端的...

    ZhangXianSheng
  • 利用php url转发 - 解决空间不提供子目录绑定功能的问题

    由于很多新手都是使用的虚拟空间都是最便宜的那种,这空间一般不支持子目录绑定。但是很多朋友又想设置几个不同的二级域名访问不同的网站程序。于是大家找到了域名url转...

    ZhangXianSheng
  • SpringBoot入门建站全系列(五)使用Spring-data-jpa操作数据库

    Mybatis插件:比较时髦,比较适合sql复杂,或者对性能要求高的应用,因为sql都是自己写的。

    品茗IT
  • SpringBoot入门建站全系列(五)使用Spring-data-jpa操作数据库CRUD

    Mybatis插件:比较时髦,比较适合sql复杂,或者对性能要求高的应用,因为sql都是自己写的。

    品茗IT
  • Spring Boot:整合Shiro权限框架

    Shiro是Apache旗下的一个开源项目,它是一个非常易用的安全框架,提供了包括认证、授权、加密、会话管理等功能,与Spring Security一样属基于权...

    朝雨忆轻尘
  • SSH框架之Spring+Struts2+Hibernate整合篇

    版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。

    海仔
  • springboot之单元测试

    https://wap.ztestin.com/site/register?usercode=FAAAQwMQGAAXAwQBA3QhExcDHAQDPjVaA...

    小老鼠
  • Spring Boot从零入门5_五脏俱全的RESTful Web Service构建

    这一节我们正式进入Spring Boot的WEB服务开发,在WEB服务中,不可缺少的我们需要去提供API出来,那么就少不了设计API,而当前流行的一套API设计...

    别打名名
  • rabbitMQ实现可靠消息投递 原

        RabbitMQ消息的可靠性主要包括两方面,一方面是通过实现消费的重试机制(通过@Retryable来实现重试,可以设置重试次数和重试频率,但是要保证幂...

    chinotan

扫码关注云+社区

领取腾讯云代金券

玩转腾讯云 有奖征文活动