本节讲解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:
 - :
 - :#ElasticsearchProperties
 - -name:#默认即为elasticsearch
 - -nodes:120.25.194.233:9300#配置es节点信息,逗号分隔,如果没有指定,则启动ClientNode
 
这些配置的属性,最终会设置到org.springframework.boot.autoconfigure.data.elasticsearch.ElasticsearchProperties这个实体中。
二、创建实体
Spring-data-elasticsearch为我们提供了@Document、@Field等注解,如果某个实体需要建立索引,只需要加上这些注解即可。例如以一个文章实体为例:
Article.java
- import.io.Serializable;
 - import.util.Date;
 - import.springframework.data.annotation.Id;
 - import.springframework.data.elasticsearch.annotations.DateFormat;
 - import.springframework.data.elasticsearch.annotations.Document;
 - import.springframework.data.elasticsearch.annotations.Field;
 - @Document(indexName="article_index",type="article",shards=5,replicas=1,indexStoreType="fs",refreshInterval="-1")
 - publicclassArticleimplementsSerializable{
 - /**
 - *
 - */
 - privatestaticfinallong=551589397625941750L;
 - @Id
 - privateLong;
 - /**标题*/
 - privateString;
 - /**摘要*/
 - privateString;
 - /**内容*/
 - privateString;
 - /**发表时间*/
 - @Field(format=DateFormat.date_time,index=FieldIndex.no,store=true,type=FieldType.Object)
 - privateDate;
 - /**点击率*/
 - privateLong;
 - //setters and getters
 - //toString
 - }
 
在需要建立索引的类上加上@Document注解,即表明这个实体需要进行索引。其定义如下:
- @Persistent
 - @Inherited
 - @Retention(RetentionPolicy.RUNTIME)
 - @Target({ElementType.TYPE})
 - public@interfaceDocument{
 - String();//索引库的名称,个人建议以项目的名称命名
 - String()default"";//类型,个人建议以实体的名称命名
 - short()default5;//默认分区数
 - short()default1;//每个分区默认的备份数
 - String()default"1s";//刷新间隔
 - String()default"fs";//索引文件存储类型
 - }
 
加上了@Document注解之后,默认情况下这个实体中所有的属性都会被建立索引、并且分词。
我们通过@Field注解来进行详细的指定,如果没有特殊需求,那么只需要添加@Document即可。在我们的案例中,使用了@Field针对日期属性postTime上进行了指定。
@Field注解的定义如下:
- @Retention(RetentionPolicy.RUNTIME)
 - @Target(ElementType.FIELD)
 - @Documented
 - @Inherited
 - public@interfaceField{
 - FieldType()defaultFieldType.Auto;#自动检测属性的类型
 - FieldIndex()defaultFieldIndex.analyzed;#默认情况下分词
 - DateFormat()defaultDateFormat.none;
 - String()default"";
 - boolean()defaultfalse;#默认情况下不存储原文
 - String()default"";#指定字段搜索时使用的分词器
 - String()default"";#指定字段建立索引时指定的分词器
 - String[]()default{};#如果某个字段需要被忽略
 - boolean()defaultfalse;
 - }
 
需要注意的是,这些默认值指的是我们没有在我们没有在属性上添加@Filed注解的默认处理。一旦添加了@Filed注解,所有的默认值都不再生效。此外,如果添加了@Filed注解,那么type字段必须指定。
三 创建Repository
我们只要编写一个接口ArticleSearchRepository,来继承Spring-data-elasticSearch提供的ElasticsearchRepository即可。
- import.springframework.data.elasticsearch.repository.ElasticsearchRepository;
 - import.data.elasticsearch.docs.Article;
 - //泛型的参数分别是实体类型和主键类型
 - publicinterfaceArticleSearchRepositoryextendsElasticsearchRepository<Article,Long>{
 - }
 
四、编写测试类
1、测试自动创建mapping
ArticleSearchRepositoryTest.java
- @RunWith(SpringJUnit4ClassRunner.class)
 - @SpringApplicationConfiguration(classes=Application.class)
 - publicclassArticleSearchRepositoryTest{
 - @Autowired
 - privateArticleSearchRepository;
 - @Test
 - publicvoid(){
 - 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
 - publicvoid(){
 - Article=newArticle();
 - .setId(1L);
 - .setTitle("elasticsearch教程");
 - .setAbstracts("spring-data-elastichSearch");
 - .setContent("SpringBoot与spring-data-elastichSearch整合");
 - .setPostTime(newDate());
 - .setClickCount(100l);
 - .save(article);
 - }
 
运行程序后,我们首先查看mapping信息有没有自动创建
此时查看创建的索引结果
 http://www.tianshouzhi.com/api/tutorials/elasticsearch/159
限定查询结果集大小
Spring Data允许开发者使用first和top关键字对返回的查询结果集大小进行限定。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来进行分页查询的情况下,同样可以使用first和top来对结果集大小进行限制。
+
注意,如果在使用Sort参数对查询结果进行排序的基础上加上对结果集大小的限制,就可以轻易的获得最大的K个元素或最小的K个元素。
https://es.yemengying.com/4/4.4/4.4.5.html
    
    









