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控制台查看映射信息

可以右边的结果中,的确出现了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信息有没有自动创建

此时查看创建的索引结果

 

 

 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

 

时间: 2024-09-11 20:30:36

5.1 入门整合案例(SpringBoot+Spring-data-elasticsearch) ---- good的相关文章

How to provide highlighting with Spring data elasticsearch

How to provide highlighting with Spring data elasticsearch @Test public void shouldReturnHighlightedFieldsForGivenQueryAndFields() { //given String documentId = randomNumeric(5); String actualMessage = "some test message"; String highlightedMess

Spring Data Elasticsearch

项目清单   elasticsearch服务下载包括其中插件和分词   http://download.csdn.net/detail/u014201191/8809619   项目源码   资源文件   app.properties   [java] view plain copy    print? elasticsearch.esNodes=localhost:9300   elasticsearch.cluster.name=heroscluster   app.xml [java] v

使用Spring Data 仓库工作 4.1-4.3

Spring Data 仓库抽象的目标是为了明显减少为了各种持久存储的来实现的数据访问层的样板代码量. Spring Data存储库文档和你的模块 本章解释了Spring Data 存储库的核心观念,以及接口.本章的信息来自Spring Data公共模块.它使用了Java Persistence API(JPA)中的配置以及代码实例.将命名空间声明和要扩展的类型扩展为你将会使用的模块的等效项.命名空间引用包含了所有被Spring Data模块支持的存储库API的XML配置,存储库查询关键字包含了

elasticsearch-Spring Data Elasticsearch @Query 报错

问题描述 Spring Data Elasticsearch @Query 报错 按照spring官方文档显示的做,eclipse报Syntax error on tokens. public interface BookRepository extends ElasticsearchRepository<Book, String> { @Query("{"bool" : {"must" : {"field" : {&quo

Spring Boot + Elasticsearch

spring data elasticsearch elasticsearch 2.0.0.RELEASE 2.2.0 1.4.0.M1 1.7.3 1.3.0.RELEASE 1.5.2 1.2.0.RELEASE 1.4.4 1.1.0.RELEASE 1.3.2 1.0.0.RELEASE https://github.com/helloworldtang/spring-data-elasticsearch 1.None of the configured nodes are availa

springboot(五):spring data jpa的使用

在上篇文章springboot(二):web综合开发中简单介绍了一下spring data jpa的基础性使用,这篇文章将更加全面的介绍spring data jpa 常见用法以及注意事项 使用spring data jpa 开发时,发现国内对spring boot jpa全面介绍的文章比较少案例也比较零碎,因此写文章总结一下.本人也正在翻译Spring Data JPA 参考指南,有兴趣的同学欢迎联系我,一起加入翻译中! spring data jpa介绍 首先了解JPA是什么? JPA(Ja

Spring Boot 整合 Spring Data Jpa

配置spring data jpa 及 整合 druid数据库连接池 添加数据库驱动依赖和spring data jpa 依赖 我们使用的是mysql数据库,还需要添加的数据库驱动依赖是mysql-connector-java <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLoc

springmvc+spring+mybatis整合案例 [first]

本次总结一个出门级别的ssm整合案例(只介绍查询操作 具体其他操作可以自己自由实现) 注意事项: 1.本案例使用intellij idea开发 2.具体jar包不做介绍(本人导入了spring的全部包+mybatis的包以及数据库驱动包和pring-mybatis整合工具包) 3.本案例很大程度上参考了一些教学视频(如有侵权,请给我留言) 4.本案例只供学习使用. 具体开发流程: 程序结构图: 配置文件的编写. 2.1 web.xml <?xml version="1.0" en

《Spring Data实战》——第2章 Repository:便利的数据访问层 2.1快速入门

第2章 Repository:便利的数据访问层 长期以来,实现应用程序的数据访问层一直是件繁琐的工作,因为我们经常需要编写大量的样板式代码,而且贫血(anemic)的领域类并没有按照真正面向对象或领域驱动方式来进行设计.因此Spring Data Repository抽象的目标就是大幅简化各种持久化存储持久层的实现.我们将会使用Spring Data JPA模块作为例子来讨论Repository抽象的基本理念.对于其他类型的存储,可以参考对应的例子. 2.1 快速入门 我们选取领域模型中的Cus