此版本仍在开发中,尚未被视为稳定版本。对于最新的稳定版本,请使用 Spring Data Elasticsearch 5.4.0spring-doc.cn

Elasticsearch 操作

Spring Data Elasticsearch 使用多个接口来定义可针对 Elasticsearch 索引调用的操作(有关反应式接口的描述,请参见反应式 Elasticsearch 操作)。spring-doc.cn

这些接口对应于 Elasticsearch API 的结构。spring-doc.cn

接口的默认实现提供:spring-doc.cn

索引管理以及索引和映射的自动创建。

接口和提供的实现(可以从实例获取)-例如通过调用 - 使用户能够在 Elasticsearch 集群中创建索引、放置映射或存储模板和别名信息。 可以使用注释设置将要创建的索引的详细信息,请参阅 索引设置 以了解更多信息。IndexOperationsElasticsearchOperationsoperations.indexOps(clazz)@Settingspring-doc.cn

这些操作都不会由 or 的实现自动完成。 调用这些方法是用户的责任。IndexOperationsElasticsearchOperationsspring-doc.cn

使用 Spring Data Elasticsearch 存储库时,支持自动创建索引和写入 Map,请参阅使用相应的 Map 自动创建索引spring-doc.cn

使用示例

该示例展示了如何在 Spring REST 控制器中使用注入的实例。 该示例假定 是一个使用 等进行 Comments 的类(请参见映射 Annotation 概述)。ElasticsearchOperationsPerson@Document@Idspring-doc.cn

示例 1.ElasticsearchOperations 使用情况
@RestController
@RequestMapping("/")
public class TestController {

  private  ElasticsearchOperations elasticsearchOperations;

  public TestController(ElasticsearchOperations elasticsearchOperations) { (1)
    this.elasticsearchOperations = elasticsearchOperations;
  }

  @PostMapping("/person")
  public String save(@RequestBody Person person) {                         (2)
    Person savedEntity = elasticsearchOperations.save(person);
    return savedEntity.getId();
  }

  @GetMapping("/person/{id}")
  public Person findById(@PathVariable("id")  Long id) {                   (3)
    Person person = elasticsearchOperations.get(id.toString(), Person.class);
    return person;
  }
}
1 让 Spring 在构造函数中注入提供的 bean。ElasticsearchOperations
2 在 Elasticsearch 集群中存储一些实体。 该 id 是从返回的实体中读取的,因为它在对象中可能为 null,并且是由 Elasticsearch 创建的。person
3 检索具有 get by id 的实体。

要查看 的全部可能性,请参阅 API 文档。ElasticsearchOperationsspring-doc.cn

搜索结果类型

当使用接口的方法检索文档时,将仅返回找到的实体。 使用界面的方法进行搜索时,每个实体都有其他信息可用,例如找到的实体的 scoresortValuesDocumentOperationsSearchOperationsspring-doc.cn

为了返回此信息,每个实体都包装在一个对象中,该对象包含此特定于实体的附加信息。 这些对象本身在一个对象中返回,该对象还包含有关整个搜索的信息,例如 maxScore 或请求的聚合或完成请求所花费的执行持续时间。 现在提供以下类和接口:SearchHitSearchHitSearchHitsspring-doc.cn

搜索 Hit<T>

包含以下信息:spring-doc.cn

搜索点击量<T>

包含以下信息:spring-doc.cn

SearchPage<T >

定义一个包含元素的 Spring Data,可用于使用存储库方法进行分页访问。PageSearchHits<T>spring-doc.cn

SearchScrollHits<T>

由 中的 低级滚动 API 函数返回,它使用 Elasticsearch 滚动 ID 丰富了 一个。ElasticsearchRestTemplateSearchHits<T>spring-doc.cn

SearchHitsIterator<T>

接口的流式处理函数返回的 Iterator。SearchOperationsspring-doc.cn

ReactiveSearchHits (响应式搜索命中)

ReactiveSearchOperations具有返回 a 的方法,这包含与对象相同的信息,但将以 a 而不是 list 的形式提供包含的对象。Mono<ReactiveSearchHits<T>>SearchHits<T>SearchHit<T>Flux<SearchHit<T>>spring-doc.cn

查询

和 接口中定义的几乎所有方法都采用一个参数,该参数定义要执行的查询以进行搜索。 是一个接口,Spring Data Elasticsearch 提供了三种实现:和 。SearchOperationsReactiveSearchOperationsQueryQueryCriteriaQueryStringQueryNativeQueryspring-doc.cn

CriteriaQuery 查询

CriteriaQuery基于查询允许创建查询来搜索数据,而无需了解 Elasticsearch 查询的语法或基础知识。 它们允许用户通过简单地链接和组合指定搜索文档必须满足的条件的对象来构建查询。Criteriaspring-doc.cn

在讨论 AND 或 OR 时,在组合条件时请记住,在 Elasticsearch 中,AND 被转换为 must 条件,OR 被转换为 should

Criteria它们的用法最好通过示例来解释(假设我们有一个具有属性的实体):Bookpricespring-doc.cn

示例 2.获取具有给定价格的图书
Criteria criteria = new Criteria("price").is(42.0);
Query query = new CriteriaQuery(criteria);

同一字段的条件可以链接,它们将与逻辑 AND 组合:spring-doc.cn

例 3.获取具有给定价格的图书
Criteria criteria = new Criteria("price").greaterThan(42.0).lessThan(34.0);
Query query = new CriteriaQuery(criteria);

当 chaining 时,默认情况下使用 AND 逻辑:Criteriaspring-doc.cn

示例 4.获取名字为 James 和姓氏为 Miller 的所有人员:
Criteria criteria = new Criteria("lastname").is("Miller") (1)
  .and("firstname").is("James")                           (2)
Query query = new CriteriaQuery(criteria);
1 第一个Criteria
2 and() 创建一个新的并将其链接到第一个。Criteria

如果要创建嵌套查询,则需要为此使用子查询。 假设我们要查找姓氏为 Miller 且名字为 JackJohn 的所有人员:spring-doc.cn

例 5.嵌套子查询
Criteria miller = new Criteria("lastName").is("Miller")  (1)
  .subCriteria(                                          (2)
    new Criteria().or("firstName").is("John")            (3)
      .or("firstName").is("Jack")                        (4)
  );
Query query = new CriteriaQuery(criteria);
1 为姓氏创建一个名字Criteria
2 this 与 AND 组合成一个 subCriteria
3 此子 Criteria 是名字 John 的 OR 组合
4 和名字 Jack

请参阅该类的 API 文档,以全面了解不同的可用操作。Criteriaspring-doc.cn

StringQuery 查询

此类将 Elasticsearch 查询作为 JSON 字符串。 以下代码显示了一个查询,该查询搜索名字为 “Jack” 的人员:spring-doc.cn

Query query = new StringQuery("{ \"match\": { \"firstname\": { \"query\": \"Jack\" } } } ");
SearchHits<Person> searchHits = operations.search(query, Person.class);

如果您已经有要使用的 Elasticsearch 查询,则使用 可能是合适的。StringQueryspring-doc.cn

NativeQuery

NativeQuery是当您有复杂查询或无法使用 API 表示的查询时(例如,在构建查询和使用聚合时)要使用的类。 它允许使用 Elasticsearch 库中的所有不同实现,因此命名为 “native”。Criteriaco.elastic.clients.elasticsearch._types.query_dsl.Queryspring-doc.cn

以下代码显示了如何搜索具有给定的 person,并且找到的文档具有 terms 聚合,用于计算这些 people 的出现次数:firstNamelastNamespring-doc.cn

Query query = NativeQuery.builder()
	.withAggregation("lastNames", Aggregation.of(a -> a
		.terms(ta -> ta.field("lastName").size(10))))
	.withQuery(q -> q
		.match(m -> m
			.field("firstName")
			.query(firstName)
		)
	)
	.withPageable(pageable)
	.build();

SearchHits<Person> searchHits = operations.search(query, Person.class);

搜索模板查询

这是与存储的搜索模板结合使用的接口的特殊实现。 有关更多信息,请参阅搜索模板支持Queryspring-doc.cn