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

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

一、环境搭建

新建maven项目,名字随意

pom.xml

  1.         <parent>
  2. <groupId>org.springframework.boot</groupId>
  3. <artifactId>spring-boot-starter-parent</artifactId>
  4. <version>1.3.1.RELEASE</version>
  5. </parent>
  6. <dependencies>
  7. <dependency>
  8. <groupId>org.springframework.boot</groupId>
  9. <artifactId>spring-boot-starter-data-elasticsearch</artifactId>
  10. </dependency>
  11. <dependency>
  12. <groupId>org.springframework.boot</groupId>
  13. <artifactId>spring-boot-starter-web</artifactId>
  14. </dependency>
  15. <dependency>
  16. <groupId>org.springframework.boot</groupId>
  17. <artifactId>spring-boot-starter-test</artifactId>
  18. </dependency>
  19. </dependencies>

application.yml

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

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

二、创建实体

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

Article.java

  1. import java.io.Serializable;
  2. import java.util.Date;
  3.  
  4. import org.springframework.data.annotation.Id;
  5. import org.springframework.data.elasticsearch.annotations.DateFormat;
  6. import org.springframework.data.elasticsearch.annotations.Document;
  7. import org.springframework.data.elasticsearch.annotations.Field;
  8.  
  9. @Document(indexName="article_index",type="article",shards=5,replicas=1,indexStoreType="fs",refreshInterval="-1")
  10. public class Article implements Serializable{
  11. /**
  12.  * 
  13.  */
  14. private static final long serialVersionUID = 551589397625941750L;
  15. @Id
  16. private Long id;
  17. /**标题*/
  18. private String title;
  19. /**摘要*/
  20. private String abstracts;
  21. /**内容*/
  22. private String content;
  23. /**发表时间*/
  24. @Field(format=DateFormat.date_time,index=FieldIndex.no,store=true,type=FieldType.Object)
  25. private Date postTime;
  26. /**点击率*/
  27. private Long clickCount;
  28. //setters and getters
  29. //toString
  30. }

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

  1. @Persistent
  2. @Inherited
  3. @Retention(RetentionPolicy.RUNTIME)
  4. @Target({ElementType.TYPE})
  5. public @interface Document {
  6.  
  7. String indexName();//索引库的名称,个人建议以项目的名称命名
  8.  
  9. String type() default "";//类型,个人建议以实体的名称命名
  10.  
  11. short shards() default 5;//默认分区数
  12.  
  13. short replicas() default 1;//每个分区默认的备份数
  14.  
  15. String refreshInterval() default "1s";//刷新间隔
  16.  
  17. String indexStoreType() default "fs";//索引文件存储类型
  18. }

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

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

@Field注解的定义如下:

  1. @Retention(RetentionPolicy.RUNTIME)
  2. @Target(ElementType.FIELD)
  3. @Documented
  4. @Inherited
  5. public @interface Field {
  6.  
  7. FieldType type() default FieldType.Auto;#自动检测属性的类型
  8.  
  9. FieldIndex index() default FieldIndex.analyzed;#默认情况下分词
  10.  
  11. DateFormat format() default DateFormat.none;
  12.  
  13. String pattern() default "";
  14.  
  15. boolean store() default false;#默认情况下不存储原文
  16.  
  17. String searchAnalyzer() default "";#指定字段搜索时使用的分词器
  18.  
  19. String indexAnalyzer() default "";#指定字段建立索引时指定的分词器
  20.  
  21. String[] ignoreFields() default {};#如果某个字段需要被忽略
  22.  
  23. boolean includeInParent() default false;
  24. }

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

 

三 创建Repository

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

  1. import org.springframework.data.elasticsearch.repository.ElasticsearchRepository;
  2.  
  3. import spring.data.elasticsearch.docs.Article;
  4.  
  5. //泛型的参数分别是实体类型和主键类型
  6. public interface ArticleSearchRepository extends ElasticsearchRepository<Article, Long>{
  7.  
  8. }

四、编写测试类

1、测试自动创建mapping

ArticleSearchRepositoryTest.java

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @SpringApplicationConfiguration(classes=Application.class)
  3. public class ArticleSearchRepositoryTest {
  4.  
  5. @Autowired
  6. private ArticleSearchRepository articleSearchRepository;
  7. @Test
  8. public void test(){
  9. System.out.println("演示初始化");
  10. }
  11.  
  12. }

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

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

QQ截图20160317013610.png

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

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

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

2、测试保存

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

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

QQ截图20160317014727.png

此时查看创建的索引结果

QQ截图20160317014853.png

 
 
 http://www.tianshouzhi.com/api/tutorials/elasticsearch/159

限定查询结果集大小

Spring Data允许开发者使用firsttop关键字对返回的查询结果集大小进行限定。fisrt和top需要跟着一个代表返回的结果集的最大大小的数字。如果没有跟着一个数字,那么返回的结果集大小默认为1。

Example 8.Limiting the result size of query with Top and First(利用first和top限制返回的结果集大小)

User findFirstByOrderByLastnameAsc();

User findTopByOrderByAgeDesc();

Page<User> queryFirst10ByLastname(String lastname, Pageable pageable);

Slice<User> findTop3ByLastname(String lastname, Pageable pageable);

List<User> findFirst10ByLastname(String lastname, Sort sort);

List<User> findTop10ByLastname(String lastname, Pageable pageable);

限制结果集的表达式还支持Distinct关键字。并且,当返回的结果集大小限制为1时,Spring Data支持将返回结果包装到Optional(java 8新增,这是一个可以为null的容器对象。如果值存在则isPresent()方法会返回true,调用get()方法会返回该对象)之中,例子如下:

Optional<User> findFirstByOrderByLastnameAsc();

在查询用page和slice来进行分页查询的情况下,同样可以使用firsttop来对结果集大小进行限制。

+

 

注意,如果在使用Sort参数对查询结果进行排序的基础上加上对结果集大小的限制,就可以轻易的获得最大的K个元素或最小的K个元素。

 

https://es.yemengying.com/4/4.4/4.4.5.html

 

posted @ 2016-11-25 19:40  沧海一滴  阅读(22072)  评论(2编辑  收藏  举报