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

Elasticsearch Java客户端SearchResponse无法识别聚合/存储桶

武元白
2023-03-14

ElasticsearchJava客户端SearchACK无法解析聚合结果。我在网上看到一些文章,建议添加以键为前缀的聚合类型。我添加了我认为适用于我的用例的内容,例如“sterms#和sum#”,但我无法确定哪种类型适用于主过滤器(在我的情况下键:“匹配”)。我希望桶对象被填充,但尽管elasticsearch的响应包含聚合,但它目前仍作为空数组返回。

注:这是为了能够进行单元测试。

Json响应:

{
  "took": 7,
  "timed_out": false,
  "_shards": {
    "total": 75,
    "successful": 75,
    "skipped": 0,
    "failed": 0
  },
  "hits": {
    "total": 776329,
    "max_score": 0,
    "hits": []
  },
  "aggregations": {
    "sterms#matched": {
      "doc_count": 15,
      "sterms#id": {
        "doc_count_error_upper_bound": 0,
        "sum_other_doc_count": 0,
        "buckets": [
          {
            "key": "mykey",
            "doc_count": 15,
            "sterms#manufacturerName": {
              "doc_count_error_upper_bound": 0,
              "sum_other_doc_count": 0,
              "buckets": [
                {
                  "key": "subkey",
                  "doc_count": 15
                }
              ]
            },
            "sum#totalCars": {
              "value": 214244
            },
            "sum#totalTrucks": {
              "value": 155738
            }
          }
        ]
      }
    }
  }
}

Java中的解析器

public static SearchResponse getSearchResponseFromJson(final String jsonFileName) {
        try {
            String jsonResponse = IOUtils.toString(new FileInputStream(jsonFileName));
            NamedXContentRegistry registry = new NamedXContentRegistry(getDefaultNamedXContents());
            XContentParser parser = JsonXContent.jsonXContent.createParser(registry, jsonResponse);
            return SearchResponse.fromXContent(parser);
        } catch (IOException e) {
            throw new RuntimeException("Failed to get resource: " + jsonFileName, e);
        } catch (Exception e) {
            throw new RuntimeException(("exception " + e));
        }
    }

    private static List<NamedXContentRegistry.Entry> getDefaultNamedXContents() {
        Map<String, ContextParser<Object, ? extends Aggregation>> map = new HashMap<>();
        map.put(TopHitsAggregationBuilder.NAME, (parser, content) -> ParsedTopHits.fromXContent(parser, (String) content));
        map.put(StringTerms.NAME, (parser, content) -> ParsedStringTerms.fromXContent(parser, (String) content));
        map.put(SumAggregationBuilder.NAME, (parser, content) -> ParsedSum.fromXContent(parser, (String) content));
        //map.put(ScriptedMetricAggregationBuilder.NAME, (parser, content) -> ParsedScriptedMetric.fromXContent(parser, (String) content));
        List<NamedXContentRegistry.Entry> entries = map.entrySet()
                                                       .stream()
                                                       .map(entry -> new NamedXContentRegistry.Entry(Aggregation.class,
                                                               new ParseField(entry.getKey()),
                                                               entry.getValue()))
                                                       .collect(Collectors.toList());
        return entries;
    }

空桶解析响应(期望桶具有totalCars和totalTrucks的聚合)

{
    "took": 7,
    "timed_out": false,
    "_shards": {
        "total": 75,
        "successful": 75,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 776329,
        "max_score": 0,
        "hits": []
    },
    "aggregations": {
        "sterms#matched": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": []
        }
    }
}

我不确定斯特姆斯是否是过滤器的正确类型

共有1个答案

闻人树
2023-03-14

需要使用哪种类型的答案是“过滤器”(filter#matched)。Java类对应的是FilterAggregationBuilder

 类似资料:
  • 所以我做了一个minecraft客户端,当涉及到在调试和通过eclipse正常运行它时,我一直得到错误“无法识别的选项:-Xincgc”。这些窗口也会弹出:在这里输入图像描述 在此处输入图像描述 我已经尝试重新安装eclipse和jdk,但没有成功。 我在想是因为没有eclipse.ini:在这里输入图像描述 我想知道这是否与此有关?

  • 客户端存储

  • 关于如何使用传递的参数的任何线索。

  • 我使用。NET Core2.0和ASP.NET Core2.0进行应用程序开发。“测试”应用程序是一个。NET核心控制台应用程序。我正在编写的核心代码是一个类库。一旦适当的测试。我选择这样做是因为我暂时不会使用它(它正在替换旧的ASPNET代码)。 无论如何,由于我必须处理各种服务的大量API密钥,所以我决定使用Microsoft Azure Key Vault来存储密钥。我有这一切设置,并理解这

  • 对于我的应用程序,我有一个服务器端数据库,在其中存储用户及其数据。我想知道如何跟踪哪个用户拥有哪个UUID。我想确保只有具有自己唯一UUID的同一用户才能访问数据库中的数据。 最好的方法是什么?

  • web应用允许使用浏览器提供的API实现将数据存储在用户电脑上。这种客户端存储相当于赋予了web浏览器记忆功能。比方说,web应用就可以用这些方式来“记住”用户的偏好甚至是用户的所有状态信息,以便准确地“回忆”起用户上一次访问的位置。客户端存储遵循“同源策略”,因此不同站点的页面是无法读取对于存储的数据。而同一站点的不同的页面之间是可以互相共享存储数据的,它为我们提供了一种通信机制,例如一个表单的