Elasticsearch 操作
Spring Data Elasticsearch 使用多个接口来定义可针对 Elasticsearch 索引调用的操作(有关反应式接口的描述,请参见反应式 Elasticsearch 操作)。
-
IndexOperations
定义索引级别的操作,例如创建或删除索引。 -
DocumentOperations
根据实体的 ID 定义用于存储、更新和检索实体的操作。 -
SearchOperations
定义使用查询搜索多个实体的操作 -
ElasticsearchOperations
结合了 和 接口。DocumentOperations
SearchOperations
这些接口对应于 Elasticsearch API 的结构。
接口的默认实现提供:
-
索引管理功能。
-
域类型的读/写映射支持。
-
丰富的查询和条件 API。
-
资源管理和异常转换。
索引管理以及索引和映射的自动创建。
接口和提供的实现(可以从实例获取)-例如通过调用 - 使用户能够在 Elasticsearch 集群中创建索引、放置映射或存储模板和别名信息。
可以使用注释设置将要创建的索引的详细信息,请参阅 索引设置 以了解更多信息。 这些操作都不会由 or 的实现自动完成。
调用这些方法是用户的责任。 使用 Spring Data Elasticsearch 存储库时,支持自动创建索引和写入 Map,请参阅使用相应的 Map 自动创建索引 |
使用示例
该示例展示了如何在 Spring REST 控制器中使用注入的实例。
该示例假定 是一个使用 等进行 Comments 的类(请参见映射 Annotation 概述)。ElasticsearchOperations
Person
@Document
@Id
@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 文档。ElasticsearchOperations
搜索结果类型
当使用接口的方法检索文档时,将仅返回找到的实体。
使用界面的方法进行搜索时,每个实体都有其他信息可用,例如找到的实体的 score 或 sortValues。DocumentOperations
SearchOperations
为了返回此信息,每个实体都包装在一个对象中,该对象包含此特定于实体的附加信息。
这些对象本身在一个对象中返回,该对象还包含有关整个搜索的信息,例如 maxScore 或请求的聚合或完成请求所花费的执行持续时间。
现在提供以下类和接口:SearchHit
SearchHit
SearchHits
包含以下信息:
-
ID
-
得分
-
对值进行排序
-
高亮显示字段
-
内部点击(这是包含最终返回的内部点击的嵌入对象)
SearchHits
-
检索到的类型为 <T 的实体>
包含以下信息:
-
总点击数
-
Total hits 关系
-
最高分
-
对象列表
SearchHit<T>
-
返回的聚合
-
返回的建议结果
定义一个包含元素的 Spring Data,可用于使用存储库方法进行分页访问。Page
SearchHits<T>
由 中的 低级滚动 API 函数返回,它使用 Elasticsearch 滚动 ID 丰富了 一个。ElasticsearchRestTemplate
SearchHits<T>
接口的流式处理函数返回的 Iterator。SearchOperations
ReactiveSearchOperations
具有返回 a 的方法,这包含与对象相同的信息,但将以 a 而不是 list 的形式提供包含的对象。Mono<ReactiveSearchHits<T>>
SearchHits<T>
SearchHit<T>
Flux<SearchHit<T>>
查询
和 接口中定义的几乎所有方法都采用一个参数,该参数定义要执行的查询以进行搜索。 是一个接口,Spring Data Elasticsearch 提供了三种实现:和 。SearchOperations
ReactiveSearchOperations
Query
Query
CriteriaQuery
StringQuery
NativeQuery
CriteriaQuery 查询
CriteriaQuery
基于查询允许创建查询来搜索数据,而无需了解 Elasticsearch 查询的语法或基础知识。
它们允许用户通过简单地链接和组合指定搜索文档必须满足的条件的对象来构建查询。Criteria
在讨论 AND 或 OR 时,在组合条件时请记住,在 Elasticsearch 中,AND 被转换为 must 条件,OR 被转换为 should |
Criteria
它们的用法最好通过示例来解释(假设我们有一个具有属性的实体):Book
price
Criteria criteria = new Criteria("price").is(42.0);
Query query = new CriteriaQuery(criteria);
同一字段的条件可以链接,它们将与逻辑 AND 组合:
Criteria criteria = new Criteria("price").greaterThan(42.0).lessThan(34.0);
Query query = new CriteriaQuery(criteria);
当 chaining 时,默认情况下使用 AND 逻辑:Criteria
Criteria criteria = new Criteria("lastname").is("Miller") (1)
.and("firstname").is("James") (2)
Query query = new CriteriaQuery(criteria);
1 | 第一个Criteria |
2 | and() 创建一个新的并将其链接到第一个。Criteria |
如果要创建嵌套查询,则需要为此使用子查询。 假设我们要查找姓氏为 Miller 且名字为 Jack 或 John 的所有人员:
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 文档,以全面了解不同的可用操作。Criteria
StringQuery 查询
此类将 Elasticsearch 查询作为 JSON 字符串。 以下代码显示了一个查询,该查询搜索名字为 “Jack” 的人员:
Query query = new StringQuery("{ \"match\": { \"firstname\": { \"query\": \"Jack\" } } } ");
SearchHits<Person> searchHits = operations.search(query, Person.class);
如果您已经有要使用的 Elasticsearch 查询,则使用 可能是合适的。StringQuery
NativeQuery
NativeQuery
是当您有复杂查询或无法使用 API 表示的查询时(例如,在构建查询和使用聚合时)要使用的类。
它允许使用 Elasticsearch 库中的所有不同实现,因此命名为 “native”。Criteria
co.elastic.clients.elasticsearch._types.query_dsl.Query
以下代码显示了如何搜索具有给定的 person,并且找到的文档具有 terms 聚合,用于计算这些 people 的出现次数:firstName
lastName
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);
搜索模板查询
这是与存储的搜索模板结合使用的接口的特殊实现。
有关更多信息,请参阅搜索模板支持。Query