使用Spring Data ElasticsearchRepository在ElasticSearch中查找唯一字段值

问题描述 投票:0回答:1

我有一个扩展ElasticsearchRepository的接口,并成功创建了搜索方法,例如:

Page<AuditResult> findByCustomerCodeAndHost(String customerCode, String host, Pageable pageable);

现在,我希望命中一个端点,该端点将为我返回该customerCode的所有可能的主机值,以便我可以在前端构建一个下拉列表以选择一个值发送给该findByCustomerCodeAndHost端点,例如:] >

List<String> findUniqueHostByCustomerCode(String customerCode)

使用ElasticsearchRepository甚至可能吗?

我知道我可以使用像Distinct这样的关键字List<String> findDistinctByCustomerCode(String customerCode);,但这不能让我指定主机字段。


编辑:这是我完成我想要的方法的方法,但是由于当前无法通过ElasticsearchRepository实际完成此操作,因此这不是实际的“答案”。

我创建了一个Spring Web @RestController类,公开了一个执行聚合查询的@GetMapping REST端点。

在kibana控制台中的查询:

GET auditresult/_search
{
  "size": "0",
  "aggs" : {
    "uniq_custCode" : {
      "terms" : { "field" : "customerCode", "include": "<CUSTOMER_CODE>" },
        "aggs" : {
          "uniq_host" : {
           "terms" : { "field" : "host"}
          }
        }
      }
    }
  }

而且,基于这个问题,我想到了ElasticSearch aggregation with Java

@GetMapping("/hosts/{customerCode}")
String getHostsByCustomer(@PathVariable String customerCode) {
    SearchRequest searchRequest = new SearchRequest("auditresult");
    SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder().size(0);
    IncludeExclude ie = new IncludeExclude(customerCode, "");
    TermsAggregationBuilder aggregation =
            AggregationBuilders
                    .terms("uniq_custCode").includeExclude(ie)
                    .field("customerCode")
                    .subAggregation(
                            AggregationBuilders
                                    .terms("uniq_host")
                                    .field("host")
                    );
    searchSourceBuilder.aggregation(aggregation);
    searchRequest.source(searchSourceBuilder);
    try {
        SearchResponse searchResponse = client.search(searchRequest, RequestOptions.DEFAULT);
        Terms cust = searchResponse.getAggregations().get("uniq_custCode");
        StringBuilder sb = new StringBuilder();
        sb.append("{\"hosts\":[");
        for (Terms.Bucket bucket : cust.getBuckets()) {
            Terms hosts = bucket.getAggregations().get("uniq_hosts");
            for (Terms.Bucket host : hosts.getBuckets()) {
                System.out.println(host.getKey());
                sb.append("\"" + host.getKey() + "\",");
            }
        }
        String out = sb.toString();
        out = out.substring(0, out.length() - 1);
        return out + "]}";
    } catch (IOException e) {
        e.printStackTrace();
        return "{\"hosts\":[]}";
    }
}

我有一个扩展ElasticsearchRepository的接口,并成功创建了搜索方法,例如:Page findByCustomerCodeAndHost(String customerCode,String host,...

java rest elasticsearch spring-data-elasticsearch
1个回答
1
投票

这里您需要的是Spring Data称为投影的东西,对于Spring Data MongoDB,您可以read the documentation查看其工作原理。

las,这尚未在Spring Data Elasticsearch中实现,但我为此创建了an issue in Jira

© www.soinside.com 2019 - 2024. All rights reserved.