最新的稳定版本请使用 Spring Data Elasticsearch 5.3.1! |
最新的稳定版本请使用 Spring Data Elasticsearch 5.3.1! |
Spring Data Elasticsearch使用多个接口来定义可以针对Elasticsearch索引调用的操作(有关响应式接口的说明,请参阅响应式Elasticsearch操作)。
-
IndexOperations
定义索引级别的操作,例如创建或删除索引。 -
DocumentOperations
定义基于实体 ID 存储、更新和检索实体的操作。 -
SearchOperations
定义使用查询搜索多个实体的操作 -
ElasticsearchOperations
组合 和 接口。DocumentOperations
SearchOperations
这些接口对应于 Elasticsearch API 的结构。
接口的默认实现提供:
-
索引管理功能。
-
对域类型的读/写映射支持。
-
丰富的查询和条件 API。
-
资源管理和异常转换。
索引管理以及索引和映射的自动创建。
可以从实例获取的接口和提供的实现(例如,通过调用 - 使用户能够在 Elasticsearch 集群中创建索引、放置映射或存储模板和别名信息。
可以使用注释设置将要创建的索引的详细信息,有关详细信息,请参阅索引设置。 这些操作都不是由 或 的实现自动完成的。
调用方法由用户负责。 使用 Spring Data Elasticsearch 存储库时,支持自动创建索引和编写映射,请参阅自动创建具有相应映射的索引 |
索引管理以及索引和映射的自动创建。
可以从实例获取的接口和提供的实现(例如,通过调用 - 使用户能够在 Elasticsearch 集群中创建索引、放置映射或存储模板和别名信息。
可以使用注释设置将要创建的索引的详细信息,有关详细信息,请参阅索引设置。 这些操作都不是由 或 的实现自动完成的。
调用方法由用户负责。 使用 Spring Data Elasticsearch 存储库时,支持自动创建索引和编写映射,请参阅自动创建具有相应映射的索引 |
使用示例
该示例演示如何在 Spring REST 控制器中使用注入的实例。
该示例假定 that 是一个用 等 批注的类(请参见 映射批注概述)。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
1 | 让 Spring 在构造函数中注入提供的 bean。ElasticsearchOperations |
2 | 在 Elasticsearch 集群中存储一些实体。
id 是从返回的实体中读取的,因为它可能在对象中为 null,并且是由 Elasticsearch 创建的。person |
3 | 检索具有 get by id 的实体。 |
搜索结果类型
当使用接口的方法检索文档时,将只返回找到的实体。
使用接口的方法进行搜索时,每个实体都提供了其他信息,例如找到的实体的分数或 sortValues。DocumentOperations
SearchOperations
为了返回此信息,每个实体都包装在一个包含此特定于该实体的附加信息的对象中。
这些对象本身在一个对象中返回,该对象还包含有关整个搜索的信息,如 maxScore 或请求的聚合。
现在可以使用以下类和接口:SearchHit
SearchHit
SearchHits
包含以下信息:
-
同上
-
得分
-
对值进行排序
-
突出显示字段
-
内部命中(这是一个嵌入对象,包含最终返回的内部命中)
SearchHits
-
检索到的 <T 类型的实体>
包含以下信息:
-
总点击数
-
总命中数关系
-
最高分
-
对象列表
SearchHit<T>
-
返回的聚合
-
返回的建议结果
定义一个包含元素的 Spring Data,该元素可用于使用存储库方法进行分页访问。Page
SearchHits<T>
由低级滚动 API 函数返回,它用 Elasticsearch 滚动 ID 扩充 a。ElasticsearchRestTemplate
SearchHits<T>
接口的流函数返回的迭代器。SearchOperations
ReactiveSearchOperations
有返回 a 的方法,它包含与对象相同的信息,但将包含的对象作为 a 而不是列表提供。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 被转换为必须条件,而 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);
链接时,默认使用 AND 逻辑:Criteria
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 且名字为 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 | 这与 AND 结合到子标准 |
3 | 此子标准是名字 John 的 OR 组合 |
4 | 和名字杰克 |
请参阅该类的 API 文档,了解不同可用操作的完整概述。Criteria
字符串查询
此类将 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
下面的代码演示如何搜索具有给定和找到的文档的人员,该术语聚合计算了这些人的出现次数: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);
SearchTemplateQuery
这是接口的特殊实现,可与存储的搜索模板结合使用。
有关详细信息,请参阅搜索模板支持。Query
在组合条件时谈论 AND 或 OR 时,请记住,在 Elasticsearch 中,AND 被转换为必须条件,而 OR 被转换为 should |
1 | 第一个Criteria |
2 | and() 创建一个 new 并将其链接到第一个。Criteria |
1 | 为姓氏创建名字Criteria |
2 | 这与 AND 结合到子标准 |
3 | 此子标准是名字 John 的 OR 组合 |
4 | 和名字杰克 |