本节讲解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