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

yizhihongxing

下面是关于 "关于 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日

相关文章

  • springboot+springmvc+mybatis项目整合

    一、概述 本文将简要讲解如何使用SpringBoot + SpringMVC + MyBatis这个组合来开发Web应用。这一组合是非常流行的,MyBatis负责ORM,SpringMVC负责MVC框架,SpringBoot则帮助我们快速搭建整个应用。 二、环境搭建 首先,我们需要在本地环境中安装JDK、Maven以及相应的IDE。为了便于快速上手,可以使用…

    Java 2023年5月15日
    00
  • JavaEE SpringMyBatis是什么? 它和Hibernate的区别及如何配置MyBatis

    JavaEE SpringMyBatis是JavaEE开发的一种技术栈组合,主要包含Spring框架和MyBatis持久层框架,用于简化JavaEE应用程序的开发和管理。下面分别详细讲解JavaEE、Spring和MyBatis以及它们之间的区别,最后提供MyBatis的配置攻略和示例。 JavaEE是什么? JavaEE(Java Enterprise E…

    Java 2023年5月19日
    00
  • Java和SQL实现取两个字符间的值

    要实现取两个字符间的值,可以使用Java的字符串截取和SQL的substr函数两种方法。 Java实现 1. 使用String.substring方法 使用String.substring方法可以截取原字符串中两个索引位置之间的子串。 String str = "Hello World"; String result = str.subs…

    Java 2023年5月27日
    00
  • JavaWeb简单文件上传流程的实战记录

    JavaWeb简单文件上传实战攻略 简介 本攻略基于JavaWeb开发,帮助初学者快速入门文件上传功能。我们将介绍一个基于Servlet/JSP的简单文件上传例子,包含完整的代码示例、攻略细节和实践体验。 文件上传流程 JavaWeb文件上传可以分为以下几个步骤: 表单设计 – 创建一个包含 file type input 元素的表单,实现文件上传UI. 解…

    Java 2023年5月19日
    00
  • Java简单实现银行ATM系统

    Java简单实现银行ATM系统攻略 本文将带领读者一步步完成 Java 简单实现银行 ATM 系统的攻略,希望对需要学习 Java 开发的读者有所帮助。 系统功能 本系统实现了以下功能: 登录系统并输入银行卡号和密码。 成功登录后,可以查看余额和最近的交易记录。 可以进行存款和取款操作。 用户可以修改密码或退出系统。 实现步骤 步骤1:创建项目和主类文件 创…

    Java 2023年5月19日
    00
  • 浅谈java二进制、十进制、十六进制、字符串之间的相互转换

    Java进制转换攻略 Java中提供了十进制、二进制、八进制、十六进制的进制表示,同时也支持将不同进制之间进行转换,并提供字符串和数字之间的转换方法。 十进制转换为其他进制 十进制转二进制 Java中可以使用 Integer 类的 toBinaryString 方法将十进制数转换为二进制字符串,例如: int decimalNum = 123; String…

    Java 2023年5月27日
    00
  • JVM调优笔记(一)–Nacos GC引发的服务批量下线问题

    故障背景 线上批量发服务下线的告警邮件,偶发nacos连接超时。采用了spring boot admin(以下称sba)进行服务监控。 原因分析 因为sba服务是基于nacos对其它服务进行监控,所以遇到这个问题,第一怀疑对象是nacos发生问题,但不清楚具体是什么问题。由于服务过一段事件会恢复,所以nacos肯定是没有挂掉的,那么排查方向应该是针对naco…

    Java 2023年4月23日
    00
  • JAVA记住密码功能的实现代码

    下面我将为您详细讲解“JAVA记住密码功能的实现代码”的完整攻略。 什么是记住密码功能? 记住密码功能是指在用户登录过网站后,即使关闭浏览器或者退出系统之后再次打开网站或系统时,该用户的帐号及密码仍然能够自动填写在登录框中,方便用户使用。 JAVA实现记住密码功能的步骤 第一步:保存用户登录信息 当用户登录成功后,保存用户的登录信息到本地,一般采用cooki…

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