Elasticsearch Repositories

本章包括 Elasticsearch 存储库实现的详细信息。 .The sample Book entity

@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 ...
}

Automatic creation of indices with the corresponding mapping

@Document 注解有一个参数为 createIndex。如果此参数设置为 true(这是默认值),那么在启动 Spring Data Elasticsearch 启动应用程序支持时,它将在引导存储库期间检查由 @Document 注解定义的索引是否存在。

如果它不存在,则将创建索引,并且从实体的注解派生的映射(请参阅Elasticsearch Object Mapping)将写入新创建的索引。可以通过使用`@Setting`注解设置将创建的索引的详细信息,请参阅Index settings以获取进一步的信息。

Annotations for repository methods

@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);
}

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

Annotation based configuration

可以使用注解通过 JavaConfig 激活 Spring Data Elasticsearch 存储库支持。

Example 1. Spring Data Elasticsearch repositories using JavaConfig
@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 注释激活了 Repository 支持。如果未配置基本包,它将使用其所放置的配置类的基本包。
2 使用 Elasticsearch Operations 一章中显示的其中一种配置来提供一个名为 elasticsearchTemplateElasticsearchOperations 类型的 Bean。
3 让 Spring 将 Repository Bean 注入到您的类中。

Spring Namespace

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

使用 repositories 元素查找 Spring 数据存储库,如 Creating Repository Instances 中所述。

Example 2. Setting up Elasticsearch repositories using Namespace
<?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 实例。

Example 3. Transport Client using Namespace
<?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>
Example 4. Rest Client using Namespace
<?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>