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