第五章、SpringBoot集成ElasticSearch

配置环境

ElasticSearch 2.4.4

Spring Data Elasticsearch 2.1.3.RELEASE

JNA 4.3.0

项目结构如下:

配置文件application.properties如下:

# Elasticsearch 服务地址
spring.data.elasticsearch.cluster-nodes=localhost:9300
#设置连接超时时间
spring.data.elasticsearch.properties.transpoer.tcp.connect_timeout=120s

pom.xml文件如下:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
	xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 https://maven.apache.org/xsd/maven-4.0.0.xsd">
	<modelVersion>4.0.0</modelVersion>
	<parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.5.2.RELEASE</version>
		<relativePath/> <!-- lookup parent from repository -->
	</parent>
	<groupId>com.waylau.spring.boot.blog</groupId>
	<artifactId>elasticsearch-in-action</artifactId>
	<version>1.0.0</version>
	<name>elasticsearch-in-action</name>
	<description>Demo project for Spring Boot</description>

	<properties>
		<java.version>1.8</java.version>
		<!-- thymeleaf版本及方言版本 -->
		<thymeleaf.version>3.0.3.RELEASE</thymeleaf.version>
		<thymeleaf-layout-dialect.version>2.2.0</thymeleaf-layout-dialect.version>
		<!-- 指定JNA 版本 -->
		<jna.version>4.3.0</jna.version>
	</properties>

	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-web</artifactId>
		</dependency>

		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-test</artifactId>
		</dependency>
		
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-thymeleaf</artifactId>
		</dependency>
		
		<!-- ElasticSearch -->
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
		</dependency>
		
		<!-- JNA -->
		<dependency>
		    <groupId>net.java.dev.jna</groupId>
		    <artifactId>jna</artifactId>
		</dependency>
		
	</dependencies>

	<build>
		<plugins>
			<plugin>
				<groupId>org.springframework.boot</groupId>
				<artifactId>spring-boot-maven-plugin</artifactId>
			</plugin>
		</plugins>
	</build>

</project>

EsBlog如下:

package com.waylau.spring.boot.blog.domain.es;

import java.io.Serializable;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.Document;
//文档注解  indexName:索引名称
@Document(indexName = "blog", type="blog")
public class EsBlog implements Serializable{
	private static final long serialVersionUID = 1L;
	
	@Id //主键
	private String id;
	private String title;//标题
	private String summary;//摘要
	private String content;//内容
	
	protected EsBlog(){}//JPA规范要求 防止直接使用
	
	public EsBlog(String title, String summary, String content) {
		this.title = title;
		this.summary = summary;
		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 getSummary() {
		return summary;
	}
	public void setSummary(String summary) {
		this.summary = summary;
	}
	public String getContent() {
		return content;
	}
	public void setContent(String content) {
		this.content = content;
	}

	@Override
	public String toString() {
		return "EsBlog [id=" + id + ", title=" + title + ", summary=" + summary + ", content=" + content + "]";
	}
	
}

EsBlogRepository接口如下:

package com.waylau.spring.boot.blog.repository.es;

import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import com.waylau.spring.boot.blog.domain.es.EsBlog;
/**
 * EsBlog Repository 接口
 * @author Administrator
 *
 */
public interface EsBlogRepository extends ElasticsearchRepository<EsBlog, String>{
	/**
	 * 分页查询博客(去重)
	 * @param title
	 * @param summary
	 * @param content
	 * @return
	 */
	Page<EsBlog> findDistinctEsBlogByTitleContainingOrSummaryContainingOrContentContaining(String title, String summary, String content, Pageable pageable);
}

测试类EsBlogRepositoryTest如下:

package com.waylau.spring.boot.blog.repository.es;

import org.assertj.core.api.Assertions;
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 com.waylau.spring.boot.blog.domain.es.EsBlog;


/**
 * 测试接口
 * @author Administrator
 *
 */
@RunWith(SpringRunner.class)
@SpringBootTest
public class EsBlogRepositoryTest {

	@Autowired
	private EsBlogRepository esBlogRepository;
	
	@Before
	public void initRepositoryData(){
		//清除所有数据
		esBlogRepository.deleteAll();
		
		esBlogRepository.save(new EsBlog("登鹳雀楼", "王之涣的登鹳雀楼", "白日依山尽,黄河入海流。欲穷千里目,更上一层楼。"));
		esBlogRepository.save(new EsBlog("相思", "王维的相思", "红豆生南国,春来发几枝?愿君多采撷,此物最相思。"));
		esBlogRepository.save(new EsBlog("静夜思", "李白的静夜思", "床前明月光,疑是地上霜。举头望明月,低头思故乡。"));
	}
	
	@Test
	public void testFindDistinctEsBlogByTitleContainingOrSummaryContainingOrContentContaining(){
		Pageable pageable = new PageRequest(0, 20);
		String title = "相思";
		String summary = "相思";
		String content = "相思";
		Page<EsBlog> page = esBlogRepository.findDistinctEsBlogByTitleContainingOrSummaryContainingOrContentContaining(title, summary, content, pageable);
		Assertions.assertThat(page.getTotalElements()).isEqualTo(1);//期望查到2条
		System.out.println("---------start----------");
		for(EsBlog blog : page.getContent()){
			System.out.println(blog);
		}
		System.out.println("---------eng----------");
	}
}

注意:ES版本使用的是2.4.4,先启动ES,找到解压的bin目录,双击elasticsearch.bat即可,默认访问链接http://localhost:9200

执行测试方法,控制台输出如下:

---------start----------
EsBlog [id=AXc0RRUO9MG2MK3tMEKt, title=相思, summary=王维的相思, content=红豆生南国,春来发几枝?愿君多采撷,此物最相思。]
---------eng----------

此时查询到了1条符合的数据

下面演示如何在控制器中访问

BlogController控制器如下:

package com.waylau.spring.boot.blog.controller;

import java.util.List;

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.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.RestController;

import com.waylau.spring.boot.blog.domain.es.EsBlog;
import com.waylau.spring.boot.blog.repository.es.EsBlogRepository;

/**
 * 博客Blog控制器
 * @author Administrator
 *
 */
@RestController
@RequestMapping("/blogs")
public class BlogController {
	@Autowired
	private EsBlogRepository esBlogRepository;
	
	@GetMapping
	public List<EsBlog> list(
			@RequestParam(value = "title") String title,
			@RequestParam(value = "summary") String summary,
			@RequestParam(value = "content") String content,
			@RequestParam(value = "pageIndex", defaultValue="0") int pageIndex,
			@RequestParam(value = "pageSize", defaultValue="10") int pageSize){
		//数据是在Test初始化
		Pageable pageable = new PageRequest(pageIndex, pageSize);
		Page<EsBlog> page = esBlogRepository.findDistinctEsBlogByTitleContainingOrSummaryContainingOrContentContaining(title, summary, content, pageable);
		
		return page.getContent();
	}
}

启动SpringBoot,运行测试方法,初始化数据,再在浏览器中访问  

localhost:8080/blogs?title=相思&summary=相思&content=相思

页面显示如下

若测试有问题,可以先清空ES的缓存数据,将data文件夹下的内容删除即可

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

荒--

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值