zoukankan      html  css  js  c++  java
  • 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

  • 相关阅读:
    spring对返回结果的拦截器
    mysql 8.0.15 的my.ini 配置
    利用apache 的PropertyUtilsBean 实现map和pojo相互转换
    给数字补0
    清空文件的内容 和 统计文件的大小的命令
    MySQL的replace函数的用法
    PHP Warning: Module 'modulename' already loaded in Unknown on line 0 的解决方法
    技术总监Sycx的故事
    编译PHP扩展的通用方法
    给大家推荐几本经典技术书籍
  • 原文地址:https://www.cnblogs.com/softidea/p/6102796.html
Copyright © 2011-2022 走看看