本节讲解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. :
  3. :#ElasticsearchProperties
  4. -name:#默认即为elasticsearch
  5. -nodes:120.25.194.233:9300#配置es节点信息,逗号分隔,如果没有指定,则启动ClientNode

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

二、创建实体

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

Article.java

  1. import.io.Serializable;
  2. import.util.Date;
  3.  
  4. import.springframework.data.annotation.Id;
  5. import.springframework.data.elasticsearch.annotations.DateFormat;
  6. import.springframework.data.elasticsearch.annotations.Document;
  7. import.springframework.data.elasticsearch.annotations.Field;
  8.  
  9. @Document(indexName="article_index",type="article",shards=5,replicas=1,indexStoreType="fs",refreshInterval="-1")
  10. publicclassArticleimplementsSerializable{
  11. /**
  12.  * 
  13.  */
  14. privatestaticfinallong=551589397625941750L;
  15. @Id
  16. privateLong;
  17. /**标题*/
  18. privateString;
  19. /**摘要*/
  20. privateString;
  21. /**内容*/
  22. privateString;
  23. /**发表时间*/
  24. @Field(format=DateFormat.date_time,index=FieldIndex.no,store=true,type=FieldType.Object)
  25. privateDate;
  26. /**点击率*/
  27. privateLong;

  28. //setters and getters
  29. //toString
  30. }

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

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

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

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

@Field注解的定义如下:

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

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

 

三 创建Repository

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

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

四、编写测试类

1、测试自动创建mapping

ArticleSearchRepositoryTest.java

  1. @RunWith(SpringJUnit4ClassRunner.class)
  2. @SpringApplicationConfiguration(classes=Application.class)
  3. publicclassArticleSearchRepositoryTest{
  4.  
  5. @Autowired
  6. privateArticleSearchRepository;

  7. @Test
  8. publicvoid(){
  9. System.out.println("演示初始化");
  10. }
  11.  
  12. }

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

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

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

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

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

2、测试保存

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

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

此时查看创建的索引结果

 

 

​ 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​