我有一个扩展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
这里您需要的是Spring Data称为投影的东西,对于Spring Data MongoDB,您可以read the documentation查看其工作原理。
las,这尚未在Spring Data Elasticsearch中实现,但我为此创建了an issue in Jira。