5.1 入门整合案例(SpringBoot+Spring-data-elasticsearch)

2016-03-17 01:51:03 31,804 3


本节讲解SpringBoot与Spring-data-elasticsearch整合的入门案例。

一、环境搭建

新建maven项目,名字随意

pom.xml

        <parent>
		<groupId>org.springframework.boot</groupId>
		<artifactId>spring-boot-starter-parent</artifactId>
		<version>1.3.1.RELEASE</version>
	</parent>
	<dependencies>
		<dependency>
			<groupId>org.springframework.boot</groupId>
			<artifactId>spring-boot-starter-data-elasticsearch</artifactId>
		</dependency>
		<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>
	</dependencies>

application.yml

spring: 
     data:
        elasticsearch: #ElasticsearchProperties
            cluster-name: elasticsearch #默认即为elasticsearch
            cluster-nodes: 120.25.194.233:9300 #配置es节点信息,逗号分隔,如果没有指定,则启动ClientNode

这些配置的属性,最终会设置到org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchProperties这个实体中。

二、创建实体

Spring-data-elasticsearch为我们提供了@Document@Field等注解,如果某个实体需要建立索引,只需要加上这些注解即可。例如以一个文章实体为例:

Article.java

import java.io.Serializable;
import java.util.Date;

import org.springframework.data.annotation.Id;
import org.springframework.data.elasticsearch.annotations.DateFormat;
import org.springframework.data.elasticsearch.annotations.Document;
import org.springframework.data.elasticsearch.annotations.Field;

@Document(indexName="article_index",type="article",shards=5,replicas=1,indexStoreType="fs",refreshInterval="-1")
public class Article implements Serializable{
	/**
	 * 
	 */
	private static final long serialVersionUID = 551589397625941750L;
	@Id
	private Long id;
	/**标题*/
	private String title;
	/**摘要*/
	private String abstracts;
	/**内容*/
	private String content;
	/**发表时间*/
	@Field(format=DateFormat.date_time,index=FieldIndex.no,store=true,type=FieldType.Object)
	private Date postTime;
	/**点击率*/
	private Long clickCount;
	
	//setters and getters
	//toString
	}

在需要建立索引的类上加上@Document注解,即表明这个实体需要进行索引。其定义如下:

@Persistent
@Inherited
@Retention(RetentionPolicy.RUNTIME)
@Target({ElementType.TYPE})
public @interface Document {

	String indexName();//索引库的名称,个人建议以项目的名称命名

	String type() default "";//类型,个人建议以实体的名称命名

	short shards() default 5;//默认分区数

	short replicas() default 1;//每个分区默认的备份数

	String refreshInterval() default "1s";//刷新间隔

	String indexStoreType() default "fs";//索引文件存储类型
}

加上了@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词。

我们通过@Field注解来进行详细的指定,如果没有特殊需求,那么只需要添加@Document即可。在我们的案例中,使用了@Field针对日期属性postTime上进行了指定。

@Field注解的定义如下:

@Retention(RetentionPolicy.RUNTIME)
@Target(ElementType.FIELD)
@Documented
@Inherited
public @interface Field {

	FieldType type() default FieldType.Auto;#自动检测属性的类型

	FieldIndex index() default FieldIndex.analyzed;#默认情况下分词

	DateFormat format() default DateFormat.none;

	String pattern() default "";

	boolean store() default false;#默认情况下不存储原文

	String searchAnalyzer() default "";#指定字段搜索时使用的分词器

	String indexAnalyzer() default "";#指定字段建立索引时指定的分词器

	String[] ignoreFields() default {};#如果某个字段需要被忽略

	boolean includeInParent() default false;
}

需要注意的是,这些默认值指的是我们没有在我们没有在属性上添加@Filed注解的默认处理。一旦添加了@Filed注解,所有的默认值都不再生效。此外,如果添加了@Filed注解,那么type字段必须指定。


三 创建Repository

我们只要编写一个接口ArticleSearchRepository,来继承Spring-data-elasticSearch提供的ElasticsearchRepository即可。

import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;

import spring.data.elasticsearch.docs.Article;

//泛型的参数分别是实体类型和主键类型
public interface ArticleSearchRepository extends ElasticsearchRepository<Article, Long>{

}

四、编写测试类

1、测试自动创建mapping

ArticleSearchRepositoryTest.java

@RunWith(SpringJUnit4ClassRunner.class)
@SpringApplicationConfiguration(classes=Application.class)
public class ArticleSearchRepositoryTest {

	@Autowired
	private ArticleSearchRepository articleSearchRepository;
	
	@Test
	public void test(){
		System.out.println("演示初始化");
	}

}

这个测试仅仅是为了演示应用启动后,Spring-data-elasticSearch会自动帮我们建立索引库和创建实体的mapping信息。

当成功启动之后,通过sense控制台查看映射信息

QQ截图20160317013610.png

可以右边的结果中,的确出现了article的,mapping信息。

默认情况下,在创建mapping信息的时候,只会创建添加了@Field注解的mapping信息。其他没有添加@Filed注解的字段在保存索引的时候自动确定。

需要注意的是,mapping信息可以自动创建,但是不能自动更新,也就是说,如果需要重新进行mapping映射的话,需要将原来的删除,再进行mapping映射。读者可以尝试一下将postTime的type改为FieldType.long,这种情况下,会自动将日期转换成时间戳。但是mapping信息不会自动更新,必须将原有的mapping信息删除之后,才能重新建立映射。

2、测试保存

@Test
	public void testSave(){
		Article article=new Article();
		article.setId(1L);
		article.setTitle("elasticsearch教程");
		article.setAbstracts("spring-data-elastichSearch");
		article.setContent("SpringBoot与spring-data-elastichSearch整合");
		article.setPostTime(new Date());
		article.setClickCount(100l);
		articleSearchRepository.save(article);
	}

运行程序后,我们首先查看mapping信息有没有自动创建

QQ截图20160317014727.png

此时查看创建的索引结果

QQ截图20160317014853.png