I am using spring-data-elasticsearch and I have a class as follows,
@Document(indexName = "sample")
class Sample {
@Id
private String id;
private String n_id;
private String b_ref;
private String r_ref;
private Status status;
}
Above is persisted to elasticsearch. And I have the following method to find data in it.
List<Sample> getAll(String n_id, Optional<String> b_ref, Optional<String> r_ref, List<Status> statuses);
But the challenge I am facing is I have 2 Optional fields and 1 List field that need to check if contains the status. I tried multiple ways in ElasticsearchRepository but none of them worked.
How can I build the query for the above scenario?
Advertisement
Answer
You can implement this using a CriteriaQuery (operations is an ElasticsearchOperations implementation injected in your class):
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());
}