Spring Data Elasticsearch使用多个接口来定义可以针对Elasticsearch索引调用的操作(有关响应式接口的说明,请参阅响应式Elasticsearch操作)。Spring中文文档

  • IndexOperations定义索引级别的操作,例如创建或删除索引。Spring中文文档

  • DocumentOperations定义基于实体 ID 存储、更新和检索实体的操作。Spring中文文档

  • SearchOperations定义使用查询搜索多个实体的操作Spring中文文档

  • ElasticsearchOperations组合 和 接口。DocumentOperationsSearchOperationsSpring中文文档

这些接口对应于 Elasticsearch API 的结构。Spring中文文档

接口的默认实现提供:Spring中文文档

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

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

这些操作都不是由 或 的实现自动完成的。 调用方法由用户负责。IndexOperationsElasticsearchOperationsSpring中文文档

使用 Spring Data Elasticsearch 存储库时,支持自动创建索引和编写映射,请参阅自动创建具有相应映射的索引Spring中文文档

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

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

这些操作都不是由 或 的实现自动完成的。 调用方法由用户负责。IndexOperationsElasticsearchOperationsSpring中文文档

使用 Spring Data Elasticsearch 存储库时,支持自动创建索引和编写映射,请参阅自动创建具有相应映射的索引Spring中文文档

使用示例

该示例演示如何在 Spring REST 控制器中使用注入的实例。 该示例假定 that 是一个用 等 批注的类(请参见 映射批注概述)。ElasticsearchOperationsPerson@Document@IdSpring中文文档

例 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中文文档

1 让 Spring 在构造函数中注入提供的 bean。ElasticsearchOperations
2 在 Elasticsearch 集群中存储一些实体。 id 是从返回的实体中读取的,因为它可能在对象中为 null,并且是由 Elasticsearch 创建的。person
3 检索具有 get by id 的实体。

搜索结果类型

当使用接口的方法检索文档时,将只返回找到的实体。 使用接口的方法进行搜索时,每个实体都提供了其他信息,例如找到的实体的分数sortValuesDocumentOperationsSearchOperationsSpring中文文档

为了返回此信息,每个实体都包装在一个包含此特定于该实体的附加信息的对象中。 这些对象本身在一个对象中返回,该对象还包含有关整个搜索的信息,如 maxScore 或请求的聚合。 现在可以使用以下类和接口:SearchHitSearchHitSearchHitsSpring中文文档

搜索命中<T>

包含以下信息:Spring中文文档

搜索命中<T>

包含以下信息:Spring中文文档

搜索页<T>

定义一个包含元素的 Spring Data,该元素可用于使用存储库方法进行分页访问。PageSearchHits<T>Spring中文文档

搜索滚动命中<T>

由低级滚动 API 函数返回,它用 Elasticsearch 滚动 ID 扩充 a。ElasticsearchRestTemplateSearchHits<T>Spring中文文档

SearchHitsIterator<T>

接口的流函数返回的迭代器。SearchOperationsSpring中文文档

ReactiveSearchHits

ReactiveSearchOperations有返回 a 的方法,它包含与对象相同的信息,但将包含的对象作为 a 而不是列表提供。Mono<ReactiveSearchHits<T>>SearchHits<T>SearchHit<T>Flux<SearchHit<T>>Spring中文文档

查询

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

CriteriaQuery

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

在组合条件时谈论 AND 或 OR 时,请记住,在 Elasticsearch 中,AND 被转换为必须条件,而 OR 被转换为 should

Criteria它们的用法最好通过示例来解释(假设我们有一个具有属性的实体):BookpriceSpring中文文档

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

同一字段的条件可以链接,它们将与逻辑 AND 组合在一起:Spring中文文档

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

链接时,默认使用 AND 逻辑:CriteriaSpring中文文档

例 4.获取所有姓詹姆斯姓米勒的人:
Criteria criteria = new Criteria("lastname").is("Miller") (1)
  .and("firstname").is("James")                           (2)
Query query = new CriteriaQuery(criteria);
1 第一个Criteria
2 and() 创建一个 new 并将其链接到第一个。Criteria

如果要创建嵌套查询,则需要为此使用子查询。 假设我们想找到所有姓 Miller 且名字为 JackJohn 的人:Spring中文文档

例 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 这与 AND 结合到子标准
3 此子标准是名字 John 的 OR 组合
4 和名字杰克

请参阅该类的 API 文档,了解不同可用操作的完整概述。CriteriaSpring中文文档

字符串查询

此类将 Elasticsearch 查询作为 JSON 字符串。 下面的代码演示一个查询,该查询搜索具有名字“Jack”的人员:Spring中文文档

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

如果您已经有要使用的 Elasticsearch 查询,则使用可能是合适的。StringQuerySpring中文文档

NativeQuery

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

下面的代码演示如何搜索具有给定和找到的文档的人员,该术语聚合计算了这些人的出现次数:firstNamelastNameSpring中文文档

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

SearchTemplateQuery

这是接口的特殊实现,可与存储的搜索模板结合使用。 有关详细信息,请参阅搜索模板支持QuerySpring中文文档

在组合条件时谈论 AND 或 OR 时,请记住,在 Elasticsearch 中,AND 被转换为必须条件,而 OR 被转换为 should
1 第一个Criteria
2 and() 创建一个 new 并将其链接到第一个。Criteria
1 为姓氏创建名字Criteria
2 这与 AND 结合到子标准
3 此子标准是名字 John 的 OR 组合
4 和名字杰克