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

如何在Elasticsearch中使用RestHighLevelClient获得不同的值?

彭鹭洋
2023-03-14

我在这里看到了你们为下面给出的链接提供解决方案的帖子。ElasticSearch Java API从查询生成器中获取不同的值

有没有办法通过org获得不同的电子邮件。弹性搜索。客户RestHighLevelClient?你能帮我解决这个问题吗?我试了很多方法,但都没能解决。但我可以在SQL Workbench中实现同样的功能,下面使用Kibana translator给出了等效的json查询。

SELECT DISTINCT email_client.keyword
FROM email_reference;

等效Elasticsearch查询如下:

{
  "from": 0,
  "size": 0,
  "_source": {
    "includes": ["email_client.keyword"],
    "excludes": []
  },
  "stored_fields": "email_client.keyword",
  "aggregations": {
    "email_client.keyword": {
      "terms": {
        "field": "email_client.keyword",
        "size": 200,
        "min_doc_count": 1,
        "shard_min_doc_count": 0,
        "show_term_doc_count_error": false,
        "order": [
          {
            "_count": "desc"
          },
          {
            "_key": "asc"
          }
        ]
      }
    }
  }
}

所以现在我想形成这个JSON查询使用RestHighLevelClient,我已经尝试过,但问题是准备搜索()是不是有在RestHighLevelClient有任何其他实现使用RestHighLevelClient?

共有2个答案

印晋
2023-03-14

对于7.11.2版本的elasticsearch-rest-高级-客户端,下面的例子对我有效。您需要为带有关键字的字段设置聚合。

    private List<String> queryForDistinctMetadata(String aggregationKey, String field) throws IOException {

        var aggregationBuilder = AggregationBuilders
                .terms(aggregationKey)
                .field(field);

        var searchSourceBuilder = new SearchSourceBuilder()
                .aggregation(aggregationBuilder)
                .size(0);

        var searchRequest = new SearchRequest()
                .indices("<your index here>")
                .source(searchSourceBuilder);

        var response = client.search(searchRequest, RequestOptions.DEFAULT);

        var aggregation = (ParsedStringTerms) response.getAggregations().get(aggregationKey);

        return aggregation.getBuckets()
                .parallelStream()
                .map(Terms.Bucket::getKeyAsString)
                .collect(Collectors.toList());
    }
葛驰
2023-03-14

这应该适用于RestHighLevelClient:

        MultiSearchRequest multiRequest = new MultiSearchRequest();
        SearchRequest searchRequest = new SearchRequest();
        SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        searchSourceBuilder.size(0); // return only aggregation results
        searchSourceBuilder.aggregation(AggregationBuilders.terms("label_agg").field("email_client.keyword").size(200));
        searchRequest.indices("email_reference"); // index name
        searchRequest.source(searchSourceBuilder);
        multiRequest.add(searchRequest);
        MultiSearchResponse response = restHighLevelClient.msearch(multiRequest, RequestOptions.DEFAULT);
 类似资料:
  • 问题内容: 在Elasticsearch的索引中,我保存了约30000个实体。我想使用RestHighLevelClient获得它们的所有ID。我读过,最好的方法是使用滚动API。但是,当我这样做时,我只能接收大约10个实体,而不是30k。如何解决这个问题 当我这样做时,executeQuery仅返回大约11个实体。如何解决,如何获取索引中的所有文件? 问题答案: 尝试按照以下示例操作,我正在使用

  • 问题内容: 我有一个SQL查询,该查询对3-4个表执行JOIN操作以获取数据。现在,我们正转向elasticsearch以获得更好的性能。如何使用elasticsearch复制相同的JOIN查询?我已经阅读了有关父/子文档的信息,但是我的数据没有任何严格的父/子类型的数据。 问题答案: Elasticsearch不支持JOIN,这首先是NoSQL技术的全部目的。有多种方法可以使用父/子关系(如您所

  • 这可能很容易,但不知道怎么做。 我有一个表,可以为特定的非键列字段重复值。如何使用query Builder或Eloquent编写SQL查询,以获取该列具有不同值的行? 请注意,我不是只获取该列,它与其他列值结合在一起,所以可能无法真正工作。因此,这个问题基本上可以是如何指定我想在查询中区分的列,现在不接受任何参数?

  • 我正在尝试使用Rest-Asure和Java为GET API创建测试自动化。 此API具有以下响应主体: 在此API响应中有两个同名“id”的字段。如何获取这两个字段的值? 谢谢

  • Elastic现在正在更新他们的文档,以便使用带有Java的RestHighLevelClient。它还有一个映射API: https://www.elastic.co/guide/en/elasticsearch/client/java-rest/master/java-rest-high-put-mapping.html 还是RestHighLevelClient用于高性能操作,但对于初始配置

  • 使用RestHighLevelRestClient使用ElasticSearch批量插入时出现异常。 ElasticsearchStatusException[无法解析响应体];嵌套:ResponseException[method[POST],host[http:x.com],URI[/_bulk?timeout=1m],状态行[http/1.1 413请求实体太大]{“消息”:“请求大小超过1