5.1 入门整合案例(SpringBoot+Spring-data-elasticsearch)
本节讲解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控制台查看映射信息
可以右边的结果中,的确出现了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信息有没有自动创建
此时查看创建的索引结果