下面是关于 "关于 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技术站