当前位置: 首页 > 知识库问答 >
问题:

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

韩佐
2023-03-14

我有一个扩展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\":[]}";
    }
}

共有1个答案

程志新
2023-03-14

这里您需要的是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,但我不确定这两种类型之间有什么区别,更重要的是何时使用哪种。 有人能提供建议和指导吗?