Elasticsearch 仓库
本章包含 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
注解进一步定制。请查看 Javadocs 以了解可能的配置选项。
在搜索结果中,高亮数据可以从 SearchHit
类中获取。
@SourceFilters
有时用户不需要从搜索中返回实体的所有属性,而只需要其中的一部分。Elasticsearch 提供了源过滤功能,以减少通过网络传输到应用程序的数据量。
在使用 Query
实现和 ElasticsearchOperations
时,通过在查询上设置源过滤器,这很容易实现。
在使用仓库方法时,有一个 @SourceFilters
注解:
interface BookRepository extends Repository<Book, String> {
@SourceFilters(includes = "name")
SearchHits<Book> findByName(String text);
}
在这个示例中,返回的 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
注解用于激活 Repository 支持。如果未配置基础包,它将使用放置该注解的配置类的包。通过使用 Elasticsearch 操作 章节中展示的配置之一,提供一个名为
elasticsearchTemplate
的ElasticsearchOperations
类型的 Bean。让 Spring 将 Repository 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
元素会在上下文中注册一个 Elasticsearch Server
的实例。
示例 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>