Elasticsearch 仓库

本章包含 Elasticsearch 存储库实现的详细信息。spring-doc.cadn.net.cn

示例 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 注解定义的索引是否存在。spring-doc.cadn.net.cn

如果索引不存在,将会创建该索引,并将源自实体注解的映射(参见 Elasticsearch 对象映射)写入新创建的索引中。 可以通过使用 @Setting 注解来设置将要创建的索引的详细信息,有关更多信息,请参阅 索引设置spring-doc.cadn.net.cn

仓库方法的注解

@Highlight

仓库方法上的 @Highlight 注解定义了返回实体的哪些字段应包含高亮显示。若要在 Book 的名称或摘要中搜索某些文本并对匹配数据进行高亮,可使用以下仓库方法:spring-doc.cadn.net.cn

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 以了解可能的配置选项。spring-doc.cadn.net.cn

在搜索结果中,高亮数据可以从 SearchHit 类中检索。spring-doc.cadn.net.cn

@SourceFilters

有时,用户不需要从搜索中返回实体的所有属性,而只需要其中的一部分。 Elasticsearch 提供了源过滤功能,以减少通过网络传输到应用程序的数据量。spring-doc.cadn.net.cn

当使用 Query 实现和 ElasticsearchOperations 时,只需在查询上设置源过滤器即可轻松实现。spring-doc.cadn.net.cn

在使用仓库方法时,有 @SourceFilters 注解:spring-doc.cadn.net.cn

interface BookRepository extends Repository<Book, String> {

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

在此示例中,返回的 Book 个对象的所有属性都将为 null,除了名称属性。spring-doc.cadn.net.cn

基于注解的配置

Spring Data Elasticsearch 的仓库支持可以通过 JavaConfig 使用注解来激活。spring-doc.cadn.net.cn

示例 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);
  }
}
1 EnableElasticsearchRepositories 注解用于启用仓库支持。 如果未配置基础包,它将使用其所在配置类所在的包。
2 通过使用 Elasticsearch 操作 章节中展示的其中一种配置,提供一个名为 elasticsearchTemplate、类型为 ElasticsearchOperations 的 Bean。
3 让 Spring 将 Repository Bean 注入到您的类中。

Spring 命名空间

Spring Data Elasticsearch 模块包含一个自定义命名空间,允许定义仓库 bean 以及用于实例化 ElasticsearchServer 的元素。spring-doc.cadn.net.cn

使用 repositories 元素会按照 创建 Repository 实例 中所述的方式查找 Spring Data 仓库。spring-doc.cadn.net.cn

示例 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 ClientRest Client 元素会在上下文中注册一个 Elasticsearch Server 的实例。spring-doc.cadn.net.cn

示例 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>