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

弹性搜索运算

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

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

默认的接口实现包括:spring-doc.cadn.net.cn

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

索引作接口以及可从以下条件获得的实现弹性搜索作实例——例如调用operations.indexOps(clazz)- 允许用户创建索引、放置映射或在 Elasticsearch 集群中存储模板和别名信息。 将要创建的索引细节可以通过使用@Setting注释,请参阅索引设置以获取更多信息。spring-doc.cadn.net.cn

这些作都不是由 的实现自动完成索引作弹性搜索作. 调用方法的责任是用户的。spring-doc.cadn.net.cn

使用Spring Data Elasticsearch仓库时,支持自动创建索引并编写映射,参见“自动创建索引与对应映射spring-doc.cadn.net.cn

使用示例

示例展示了如何使用注入弹性搜索作Spring REST 控制器中的实例。 本例假设是一个注释为@Document,@Id等等(参见映射注释概述)。spring-doc.cadn.net.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》在Constructor。
2 在 Elasticsearch 集群中存储某个实体。 id是从返回的实体读取的,因为它可能在对象,由Elasticsearch创建。
3 用 get by id 检索该实体。

以全面展现弹性搜索作请参阅API文档。spring-doc.cadn.net.cn

搜索结果类型

当文档被检索到以下方法时,文档作界面,只返回找到的实体。 在使用方法搜索时搜索作界面上,每个实体都可以获得额外信息,例如所找到实体的分数排序值spring-doc.cadn.net.cn

为了返回这些信息,每个实体都被包裹在搜索击中包含该实体特定附加信息的对象。 这些搜索击中对象本身在搜索精选该对象还包含整个搜索的信息,如maxScore或请求的聚合,或完成请求所需的执行时间。 以下类别和接口现已可用:spring-doc.cadn.net.cn

SearchHit<T>

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

SearchHits<T>

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

搜索页面<T>

定义Spring数据包含一个SearchHits<T>元素和可以通过仓库方法进行分页访问。spring-doc.cadn.net.cn

搜索ScrollHits<T>

由低级滚动API函数返回弹性搜索Rest模板,它丰富了SearchHits<T>带有Elasticsearch卷轴ID。spring-doc.cadn.net.cn

搜索HitsIterator<T>

通过流函数返回的迭代器搜索作接口。spring-doc.cadn.net.cn

反应性搜索热门

响应式搜索作有返回 a 的方法单<反应搜索命中<>>,这包含与SearchHits<T>但会提供包含的SearchHit<T>对象作为Flux<SearchHit<T>>而且不是作为一个列表。spring-doc.cadn.net.cn

查询

几乎所有定义在搜索作响应式搜索作接口取一个查询定义查询以执行搜索的参数。查询是一个接口,Spring Data Elasticsearch 提供三种实现:标准查询,字符串查询原生查询.spring-doc.cadn.net.cn

标准查询

标准查询基于查询的查询允许在不了解 Elasticsearch 查询的语法或基础知识的情况下创建搜索数据的查询。 它们允许用户通过简单地串联和组合来构建查询标准指定搜索文档必须满足条件的对象。spring-doc.cadn.net.cn

在讨论 AND 或 OR 时,结合条件时请记住,在 Elasticsearch 中,AND 被转换为必须条件,OR 被转换为应当条件

标准它们的用法最好用例子来解释(假设我们有具有价格财产):spring-doc.cadn.net.cn

例子2。买定价的书
Criteria criteria = new Criteria("price").is(42.0);
Query query = new CriteriaQuery(criteria);

同一字段的条件可以串联,它们会与逻辑 AND 结合:spring-doc.cadn.net.cn

例子3。买定价的书
Criteria criteria = new Criteria("price").greaterThan(42.0).lessThan(34.0);
Query query = new CriteriaQuery(criteria);

链式连接标准,默认使用与逻辑:spring-doc.cadn.net.cn

例子4。获取所有姓詹姆斯和姓米勒的人:
Criteria criteria = new Criteria("lastname").is("Miller") (1)
  .and("firstname").is("James")                           (2)
Query query = new CriteriaQuery(criteria);
1 第一标准
2 AND() 创建新的标准并将其锁链绑在第一个上。

如果你想创建嵌套查询,你需要使用子查询来实现这一点。 假设我们想找到所有姓米、名字为JackJohn的人:spring-doc.cadn.net.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 创造一个第一标准关于姓氏
2 该条件与 AND 结合为子准则
3 本子版块“标准”是名字John的手术室组合
4 以及名字杰克

请参阅标准类别中对不同可用作的完整概述。spring-doc.cadn.net.cn

字符串查询

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

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

字符串查询如果你已经有 Elasticsearch 查询,可能更合适。spring-doc.cadn.net.cn

原生查询

原生查询当你遇到复杂查询,或无法用标准比如在构建查询和使用聚合时,API。 它允许使用所有不同的方法co.elastic.clients.elasticsearch._types.query_dsl.查询因此,Elasticsearch库中的实现被称为“native”。spring-doc.cadn.net.cn

以下代码展示了如何搜索具有特定条件的人名称对于发现的文档,具有一个术语汇总,用于统计姓氏对于这些人:spring-doc.cadn.net.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);

SearchTemplateQuery

这是查询接口可与存储的搜索模板结合使用。 更多信息请参见搜索模板支持spring-doc.cadn.net.cn