关于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日

相关文章

  • 从源码角度深入解析Callable接口

    摘要:从源码角度深入解析Callable接口,希望大家踏下心来,打开你的IDE,跟着文章看源码,相信你一定收获不小。 本文分享自华为云社区《一个Callable接口能有多少知识点?》,作者: 冰 河。 并发编程一直是程序员们比较头疼的,如何编写正确的并发程序相比其他程序来说,是一件比较困难的事情,并发编程中出现的 Bug 往往也是特别诡异的。 之所以说并发编…

    Java 2023年4月18日
    00
  • 解决mybatis-plus使用jdk8的LocalDateTime 查询时报错的方法

    下面我来详细讲解“解决mybatis-plus使用jdk8的LocalDateTime查询时报错的方法”的完整攻略。 问题描述 在使用mybatis-plus时,如果使用了jdk8的LocalDateTime类型进行查询操作,可能会出现以下的错误: There is no TypeHandler found for property xxxx 这是由于myb…

    Java 2023年5月20日
    00
  • Java的Spring框架下RMI与quartz的调用方法

    Java的Spring框架下RMI与quartz的调用方法主要分为以下几个步骤: 首先需要在pom.xml文件中添加相应的依赖: <dependency> <groupId>org.springframework</groupId> <artifactId>spring-rmi</artifactId&g…

    Java 2023年5月19日
    00
  • MyEclipse通过JDBC连接MySQL数据库基本介绍

    首先需要在MyEclipse中配置JDBC驱动程序,具体步骤如下: 在工程中右键选择 “Properties”,然后在弹出的窗口中选择 “Java Build Path” 在 “Libraries” 标签页中,点击 “Add Library”,选择 “MySQL JDBC Driver”,点击 “Next” 确认MySQL JDBC驱动程序的位置是否正确,然…

    Java 2023年5月20日
    00
  • 浅谈springboot自动装配原理

    浅谈Spring Boot自动装配原理 Spring Boot是一个基于Spring框架的快速开发框架,它可以帮助我们快速构建Web应用程序。Spring Boot提供了许多自动配置类,可以帮助我们自动配置应用程序。本文将深入探讨Spring Boot自动装配的原理。 自动装配原理 Spring Boot的自动装配原理是基于Spring框架的自动装配原理。S…

    Java 2023年5月14日
    00
  • 深入理解Java线程编程中的阻塞队列容器

    深入理解Java线程编程中的阻塞队列容器 在Java多线程编程中,阻塞队列是一个非常重要的容器。它可以在生产者线程和消费者线程之间传递数据,并且能够自动地控制线程的同步和互斥。本文将从以下几个方面介绍Java线程编程中的阻塞队列容器: 阻塞队列的定义和用法 队列容器的种类和特性 阻塞队列的实现原理 阻塞队列的定义和用法 阻塞队列是一种线程安全的队列,具有自动…

    Java 2023年5月19日
    00
  • JDBC板块精华整理20051226

    首先,“JDBC板块精华整理20051226”是一份关于Java数据库连接技术的精华整理资料,它详细介绍了JDBC的基本概念、用法和常见问题解决方法。以下是该攻略的完整内容: JDBC概述 JDBC(即Java Database Connectivity)是一套用于Java编程语言与各种类型的数据库进行连接和操作的API规范。它提供了一个标准的Java接口,…

    Java 2023年6月15日
    00
  • Java实现窗体程序显示日历

    以下是详细的Java实现窗体程序显示日历的攻略: 1.准备工作 在开始编程前,需要先确定使用的开发环境和GUI工具包。一般来说,Java提供了多种GUI工具包,常见的有AWT、Swing和JavaFX等。在本文中,我们使用的是Swing工具包,因为其扩展性较强、易于学习和使用。 2.创建窗体 创建窗体需要继承JFrame类,并实现设置标题、大小、位置和关闭操…

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