关于spring5的那些事:@Indexed 解密

下面是关于 "关于 Spring5 的那些事: @Indexed 解密" 的完整攻略:

标题

1. @Indexed 的作用是什么

Spring数据可访问性框架(spring-data)提供了一个注解@Indexed,用于标记一个实体类(Entity)中的属性,使其被包含在全文搜索索引(Full Text Search Index)中。在使用Elasticsearch等全文搜索引擎时非常有用,能够提升搜索性能。

2. 如何在Spring5中使用@Indexed

使用@Indexed,需要以下几个步骤:

2.1 引入Spring-Data-ElasticSearch

在pom.xml中添加如下依赖:

<dependency>
    <groupId>org.springframework.data</groupId>
    <artifactId>spring-data-elasticsearch</artifactId>
    <version>3.2.0.RELEASE</version>
</dependency>

2.2 添加注解

在需要被全文搜索索引扫描到的属性上添加注解@Indexed,如下所示:

public class Book {
    @Id
    private String id;

    @Indexed(name = "book_name")
    private String name;

    @Indexed(name = "book_author")
    private String author;
}

2.3 构建Elasticsearch操作对象

使用以下代码构建Elasticsearch操作对象:

@Bean
public ElasticsearchOperations elasticsearchTemplate() {
    return new ElasticsearchRestTemplate(client());
}

@Bean
public RestClientBuilder restClientBuilder() {
    return RestClient.builder(new HttpHost("localhost", 9200, "http"));
}

@Bean
public RestHighLevelClient client() {
    return new RestHighLevelClient(restClientBuilder());
}

2.4 触发索引

在保存实体对象时,所有被@Indexed注解标记的属性都会被自动索引,如下所示:

@Autowired
private ElasticsearchOperations elasticsearchTemplate;

public void saveBooks(List<Book> books) {
    elasticsearchTemplate.save(books);
}

至此,@Indexed的完整使用过程介绍完毕。

3. 示例说明

下面给出两个示例,演示使用@Indexed注解实现全文搜索索引:

3.1 示例一:使用elasticsearch实现全文搜索

使用Spring-Data-ElasticSearch,使用@Indexed注解,可以很方便地将Java对象属性生成Elasticsearch文档。

//定义一个实体类
public class Book {
    @Id
    private String id;

    @Indexed(name = "book_name")
    private String name;

    @Indexed(name = "book_author")
    private String author;
}

//使用ElasticSearchRepository来完成与ElasticSearch的交互
public interface BookRepository extends ElasticsearchRepository<Book, String> {
   //自定义查询方法
    List<Book> findByName(String name);
}

在Spring配置中引入ElasticsearchTemplate:

@Bean
public ElasticsearchOperations elasticsearchTemplate() {
    return new ElasticsearchRestTemplate(client());
}

@Bean
public RestClientBuilder restClientBuilder() {
    return RestClient.builder(new HttpHost(ElasticSearchConfig.HOST, ElasticSearchConfig.PORT, ElasticSearchConfig.SCHEME));
}

@Bean
public RestHighLevelClient client() {
    return new RestHighLevelClient(restClientBuilder());
}

当使用Elasticsearch模块时,只需要将实体加上@Document注解,就可以自动为该实体创建索引、映射等:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Builder
@ToString
@Document(indexName = "book", type = "doc")
public class Book {
    @Id
    private String id;

    @Field(type = FieldType.Keyword)
    private String name;

    @Field(type = FieldType.Keyword)
    private String author;

    @Field(type = FieldType.Double)
    private Double price;
}

执行自定义查询方法:

@Autowired
private BookRepository bookRepository;

@Test 
public void test() {
    List<Book> books = bookRepository.findByName("三国演义");
    System.out.println(books);
}

以上是使用@Indexed注解与Spring-Data-Elasticsearch实现全文搜索的一个示例。

3.2 示例二:使用全文搜索提高Spring数据查询效率

以下是一个使用@Indexed注解进行全文搜索的简单示例,能够提高Spring数据框架的批量查询效率:

@Data
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "book")
public class Book {
    @Id
    private String id;

    @Column(nullable = false)
    private String name;

    @Column(nullable = false)
    private String author;

    // ...
}

//以下是使用@Indexed注解配置的BookNoSqlRepository:

public interface BookNoSqlRepository extends JpaRepository<Book, String> {

    @Indexed
    List<Book> findByName(String name);

    @Indexed
    List<Book> findByAuthor(String author);

}

在添加搜索构造器的情况下执行查询方法:

@Autowired
private BookNoSqlRepository bookRepository;

@Test
public void test() {
    List<Book> booksByName = bookRepository.findByName("国");
    List<Book> booksByAuthor = bookRepository.findByAuthor("罗贯中");
    System.out.println(booksByName);
    System.out.println(booksByAuthor);
}

以上是使用@Indexed注解提高Spring数据查询效率的一个示例。

到此为止,@Indexed解密的完整攻略就结束了。

本站文章如无特殊说明,均为本站原创,如若转载,请注明出处:关于spring5的那些事:@Indexed 解密 - Python技术站

(0)
上一篇 2023年5月31日
下一篇 2023年5月31日

相关文章

  • java实现希尔排序算法

    下面我就详细讲解一下“Java实现希尔排序算法”的攻略。 什么是希尔排序 希尔排序是插入排序的一种高效实现,也称为缩小增量排序。其基本思路是将待排序的元素分为若干组,对每组元素使用插入排序算法进行排序。然后逐渐减少元素分组的间隔,重复上述过程,直到元素之间间隔为1,获得最终的排序结果。 实现希尔排序的Java代码 下面是一个基于Java的希尔排序算法实现: …

    Java 2023年5月26日
    00
  • spring boot前后端交互之数据格式转换问题

    下面是“Spring Boot前后端交互之数据格式转换问题”的完整攻略。 1. 概述 在使用Spring Boot进行前后端交互时,常常会涉及到数据格式的转换问题,例如将Java对象转换为JSON对象,或将JSON对象转换为Java对象。这在前后端交互中非常常见,本文将简单介绍如何解决这些问题。 2. Java对象转JSON对象 Java对象转JSON对象最…

    Java 2023年5月20日
    00
  • Java日常练习题,每天进步一点点(45)

    这里是关于“Java日常练习题,每天进步一点点(45)”的完整攻略: 1. 题目描述 该题目是一道字符串操作的练习题,在给定的字符串中找到第一个不重复的字符并返回其下标,如果不存在不重复的字符,就返回 -1。 2. 解题思路 字符串操作的题目,可以使用哈希表来解决。我们可以先遍历整个字符串,用哈希表来统计每个字符出现的次数,然后再次遍历字符串,找到第一个出现…

    Java 2023年5月26日
    00
  • Java将网络图片转成输入流以及将url转成InputStream问题

    将网络图片转换为输入流以及将URL转换为InputStream是Java中常见的操作,本文将提供使用Java进行这两项操作的完整攻略。 1. 将网络图片转换为输入流 要将网络图片转换为输入流,需要使用Java的网络编程库和输入流类。 一般情况下,可以使用java.net包下的URL类和URLConnection类来获取网络图片的输入流。具体步骤如下: 使用U…

    Java 2023年5月20日
    00
  • Android RxJava异步数据处理库使用详解

    Android RxJava异步数据处理库使用详解 简介 RxJava是一个异步数据处理库,它建立在观察者模式和可观察流的基础之上。这个库的主要目的是简化异步操作的处理,提高代码的可读性和可维护性。它专注于数据流的处理,而不是UI层的处理。 RxJava可以帮助开发者避免使用回调函数和线程的管理,简化代码逻辑。RxJava可以用于处理网络请求,数据库查询,事…

    Java 2023年5月26日
    00
  • Java流程控制语句最全汇总(下篇)

    下面是Java流程控制语句最全汇总(下篇)的详细攻略: 1. continue语句 continue语句用于结束本次循环并跳过剩余循环体内的语句,进入下一次循环。其语法格式为: continue; 示例说明: for(int i=0; i<5; i++){ if(i==2){ continue; } System.out.println(i); } 运…

    Java 2023年5月23日
    00
  • Redis妙用之存储用户token问题

    下面是关于“Redis妙用之存储用户token问题”的完整攻略。这是一个用Redis来存储用户token的应用场景,主要是为了解决分布式系统中的用户身份验证问题。 1. 背景介绍 在分布式系统中,使用token来进行用户身份验证是很常见的做法。当用户登录系统时,系统会创建一个token,并将该token返回给用户。用户在接下来的请求中,会在请求头或者请求体中…

    Java 2023年5月26日
    00
  • SpringBoot 防御 CSRF 攻击的流程及原理解析

    下面是关于SpringBoot防御CSRF攻击的流程及原理解析的完整攻略。 什么是CSRF攻击? CSRF(Cross-site request forgery)攻击,中文名为跨站请求伪造攻击,指的是攻击者通过操纵用户在当前登录的网站发起一些未经授权的操作,例如在用户未登出的情况下转账等操作。攻击者通常在第三方网站发布伪造的请求链接,然后引诱用户在当前浏览器…

    Java 2023年5月20日
    00
合作推广
合作推广
分享本页
返回顶部