跳到主要内容
版本:6.1.1

Elasticsearch 仓库

Doubao 中英对照 Elasticsearch Repositories

本章介绍 Elasticsearch 仓库实现的详细内容。

示例 1. 样例 Book 实体

@Document(indexName="books")
class Book {
@Id
private String id;

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

@Field(type = FieldType.Text)
private String summary;

@Field(type = FieldType.Integer)
private Integer price;

// getter/setter ...
}

自动创建索引及相应映射​

@Document 注解有一个 createIndex 参数。如果该参数被设置为 true(这是默认值),Spring Data Elasticsearch 将在应用程序启动时初始化仓库支持的过程中,检查 @Document 注解所定义的索引是否存在。

如果索引不存在,将创建该索引,并将从实体注解派生的映射(请参阅 Elasticsearch 对象映射)写入新创建的索引。将要创建的索引的详细信息可以通过 @Setting 注解设置,更多信息请参阅索引设置。

仓库方法的注解​

@Highlight​

仓库方法上的 @Highlight 注解定义了应在返回实体的哪些字段中包含高亮。要在 Book 的名称或摘要中搜索某些文本并高亮显示找到的数据,可以使用以下仓库方法:

interface BookRepository extends Repository<Book, String> {

@Highlight(fields = {
@HighlightField(name = "name"),
@HighlightField(name = "summary")
})
SearchHits<Book> findByNameOrSummary(String text, String summary);
}

可以像上面这样定义多个要高亮的字段,并且 @Highlight 和 @HighlightField 注解都可以通过 @HighlightParameters 注解进一步定制。可能的配置选项请查阅 Javadoc。

在搜索结果中,高亮数据可以从 SearchHit 类中获取。

@SourceFilters​

有时用户并不需要从搜索中返回实体的所有属性,而只需要其中一个子集。Elasticsearch 提供了源过滤,以减少通过网络传输到应用程序的数据量。

在使用 Query 实现和 ElasticsearchOperations 时,只需在查询上设置源过滤即可轻松实现这一点。

在使用仓库方法时,可以使用 @SourceFilters 注解:

interface BookRepository extends Repository<Book, String> {

@SourceFilters(includes = "name")
SearchHits<Book> findByName(String text);
}

在此示例中,除了 name 之外,返回的 Book 对象的所有属性都将为 null。

基于注解的配置​

可以通过 JavaConfig 使用一个注解来激活 Spring Data Elasticsearch 仓库支持。

示例 2. 使用 JavaConfig 的 Spring Data Elasticsearch 仓库

@Configuration
@EnableElasticsearchRepositories( 1
basePackages = "org.springframework.data.elasticsearch.repositories"
)
static class Config {

@Bean
public ElasticsearchOperations elasticsearchTemplate() { 2
// ...
}
}

class ProductService {

private ProductRepository repository; 3

public ProductService(ProductRepository repository) {
this.repository = repository;
}

public Page<Product> findAvailableBookByName(String name, Pageable pageable) {
return repository.findByAvailableTrueAndNameStartingWith(name, pageable);
}
}
  • @EnableElasticsearchRepositories 注解激活仓库支持。如果未配置基础包,它将使用所放置的配置类所在的包。

  • 使用 Elasticsearch 操作一章中所示的配置之一,提供一个名为 elasticsearchTemplate、类型为 ElasticsearchOperations 的 Bean。

  • 让 Spring 将仓库 Bean 注入到您的类中。

Spring 命名空间​

Spring Data Elasticsearch 模块包含一个自定义命名空间,允许定义仓库 Bean,以及用于实例化 ElasticsearchServer 的元素。

使用 repositories 元素会按照创建仓库实例中所述查找 Spring Data 仓库。

示例 3. 使用命名空间搭建 Elasticsearch 仓库

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/data/elasticsearch
https://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd">

<elasticsearch:repositories base-package="com.acme.repositories" />

</beans>

使用 Transport Client 或 Rest Client 元素会在上下文中注册一个 ElasticsearchServer 实例。

示例 4. 使用命名空间的传输客户端

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans-3.1.xsd
http://www.springframework.org/schema/data/elasticsearch
https://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch-1.0.xsd">

<elasticsearch:transport-client id="client" cluster-nodes="localhost:9300,someip:9300" />

</beans>

示例 5. 使用命名空间的 REST 客户端

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
xsi:schemaLocation="http://www.springframework.org/schema/data/elasticsearch
https://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd
http://www.springframework.org/schema/beans
https://www.springframework.org/schema/beans/spring-beans.xsd">

<elasticsearch:rest-client id="restClient" hosts="http://localhost:9200">

</beans>