如何在 ElasticsearchRepository 中使用可选数据和列表数据进行搜索?
How to search with optional data and list data in ElasticsearchRepository?
我正在使用 spring-data-elasticsearch
并且我有一个 class 如下,
@Document(indexName = "sample")
class Sample {
@Id
private String id;
private String n_id;
private String b_ref;
private String r_ref;
private Status status;
}
以上内容持续到elasticsearch
。我有以下方法可以在其中查找数据。
List<Sample> getAll(String n_id, Optional<String> b_ref, Optional<String> r_ref, List<Status> statuses);
但我面临的挑战是我有 2 个 Optional
字段和 1 个 List
字段需要检查 contains
状态。我在 ElasticsearchRepository
中尝试了多种方法,但其中 none 有效。
如何为上述场景构建查询?
您可以使用 CriteriaQuery
实现此功能(operations
是在您的 class 中注入的 ElasticsearchOperations
实现):
List<Sample> getAll(String n_id, Optional<String> b_ref, Optional<String> r_ref, List<Status> statuses) {
Criteria criteria = new Criteria("nid").is(n_id).and("status").in(statuses);
if (b_ref.isPresent()) {
criteria = criteria.and("b_ref").is(b_ref.get());
}
if (r_ref.isPresent()) {
criteria = criteria.and("r_ref").is(r_ref.get());
}
SearchHits<Sample> searchHits = operations.search(new CriteriaQuery(criteria), Sample.class);
// to only get the objects without hit information
return searchHits.stream().map(SearchHit::getContent).collect(Collectors.toList());
}
我正在使用 spring-data-elasticsearch
并且我有一个 class 如下,
@Document(indexName = "sample")
class Sample {
@Id
private String id;
private String n_id;
private String b_ref;
private String r_ref;
private Status status;
}
以上内容持续到elasticsearch
。我有以下方法可以在其中查找数据。
List<Sample> getAll(String n_id, Optional<String> b_ref, Optional<String> r_ref, List<Status> statuses);
但我面临的挑战是我有 2 个 Optional
字段和 1 个 List
字段需要检查 contains
状态。我在 ElasticsearchRepository
中尝试了多种方法,但其中 none 有效。
如何为上述场景构建查询?
您可以使用 CriteriaQuery
实现此功能(operations
是在您的 class 中注入的 ElasticsearchOperations
实现):
List<Sample> getAll(String n_id, Optional<String> b_ref, Optional<String> r_ref, List<Status> statuses) {
Criteria criteria = new Criteria("nid").is(n_id).and("status").in(statuses);
if (b_ref.isPresent()) {
criteria = criteria.and("b_ref").is(b_ref.get());
}
if (r_ref.isPresent()) {
criteria = criteria.and("r_ref").is(r_ref.get());
}
SearchHits<Sample> searchHits = operations.search(new CriteriaQuery(criteria), Sample.class);
// to only get the objects without hit information
return searchHits.stream().map(SearchHit::getContent).collect(Collectors.toList());
}