我有一个扩展Elasticsearch chRepository的接口,并成功创建了搜索方法,例如:
<代码>页面
现在,我希望找到一个endpoint,该endpoint将返回该customerCode的所有可能主机值,以便我可以在前端构建一个下拉列表,以选择要发送到该findByCustomerCodeAndHostendpoint的值,类似于:
<代码>列表
使用ElasticsearchRepository是否可能做到这一点?
我知道我可以使用不同的关键字,如List
编辑:以下是我如何实现我想要的,但由于目前无法使用ElasticsearchRepository实现这一点,因此这不是一个实际的“答案”。
我创建了一个Spring web RestController类,该类公开了一个执行聚合查询的GetMapping RESTendpoint。
kibana控制台中的查询:
GET auditresult/_search
{
"size": "0",
"aggs" : {
"uniq_custCode" : {
"terms" : { "field" : "customerCode", "include": "<CUSTOMER_CODE>" },
"aggs" : {
"uniq_host" : {
"terms" : { "field" : "host"}
}
}
}
}
}
基于这个问题,我提出了用Java进行ElasticSearch聚合
@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称为projections的东西,对于Spring Data MongoDB,您可以阅读文档来了解它是如何工作的。
唉,这在Spring Data Elasticsearch中还没有实现,我在Jira中为此创建了一个问题。
我希望从ES中获得聚合结果,例如,对于与术语匹配的文档,
我使用的是Spring Boot 2.1.6和Elasticsearch 6.2.2 编辑以更好地澄清我的问题: 当我让Spring在我的存储库中使用以下方法为我生成查询时: 我想这意味着它将从索引中选择,然后按创建的降序排列结果,最后它将只返回第一个(最新)结果。 但索引中只有两个条目,相同的条目减去创建日期,该查询返回两个结果。我认为这意味着它不会转化为我所想的,而是会选择具有该ID的所有帐户
我正在使用Spring Elasticsearch chRepository来查询Elasticsearch: 我可以成功运行搜索查询并检索映射到MyDocument bean中的elasticsearch结果列表 虽然发送到elasticsearch和响应的查询是正确的(我可以在调试日志中看到突出显示块)并且结果也合适,但我不知道如何在我的java代码中获取突出显示信息。 我不想使用Elasti
我使用的是spring boot starter数据elasticsearch(2.3.0版本),它使用的是spring数据elasticsearch(4.0.0版本)。 官方文档显示了ElasticsearchRestTemplate和ElasticsearchRepository的用法。为文档编制索引的推荐方法是什么? 这里也有一个类似的问题,但已经有5年多了。
你好,我正在尝试使用ElasticSearch引擎按距离对实体进行排序。我添加了5个具有“GeoPoint”值的实体,现在我尝试按距离排序返回它。 我的模型类 我的示例测试代码 ElasticSearch节点2.2.0 Spring数据ElasticSearch 2.0.7 ElasticSearch TransportClient 2.2.0 杰克逊2.7.6 SpringMVC 4.3.6 堆
我参考的是Spring Data Elasticsearch 它们似乎是实现相同目标的两种不同API,但我不确定这两种类型之间有什么区别,更重要的是何时使用哪种。 有人能提供建议和指导吗?