gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-02 08:40:34 43 4
gpt4 key购买 nike

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

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 网络 @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\":[]}";
}
}

最佳答案

这里你需要的是 Spring Data 所谓的投影,对于 Spring Data MongoDB 你可以 read the documentation看看它是如何工作的。

唉,这在 Spring Data Elasticsearch 中还没有实现,我创建了 an issue in Jira为此。

关于java - 使用 Spring Data ElasticsearchRepository 在 ElasticSearch 中查找唯一字段值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/61414148/

43 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com