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()); }