弹性Java客户端从HTTP API返回不同的结果

前端之家收集整理的这篇文章主要介绍了弹性Java客户端从HTTP API返回不同的结果前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。

我有一个使用Elasticsearch Java API(5.6.7)的应用程序来执行聚合查询(术语).我使用curl和HTTP API(显示相关信息)创建了以下搜索文档:

  1. {
  2. "from" : 0,"size" : 0,"sort" : [
  3. {
  4. "@timestamp" : {
  5. "order" : "desc"
  6. }
  7. }
  8. ],"aggregations" : {
  9. "level" : {
  10. "terms" : {
  11. "field" : "level.keyword","size" : 10,"min_doc_count" : 1,"shard_min_doc_count" : 0,"show_term_doc_count_error" : false,"order" : [
  12. {
  13. "_count" : "desc"
  14. },{
  15. "_term" : "asc"
  16. }
  17. ]
  18. }
  19. }
  20. }
  21. }

既然已经在我的Java程序中实现了查询,我注意到结果与HTTP API结果不同!

两者都返回与分片,命中数等完全相同的元信息:

  1. {
  2. "took": 1,"timed_out": false,"_shards": {
  3. "total": 5,"successful": 5,"skipped": 0,"Failed": 0
  4. },"hits": {
  5. "total": 3659,"max_score": 0.0,"hits": [
  6. ]
  7. }

但是,从Java API返回的聚合不包含任何存储桶:

  1. "aggregations": {
  2. "level": {
  3. "doc_count_error_upper_bound": 0,"sum_other_doc_count": 0,"buckets": [
  4. ]
  5. }

虽然HTTP API中的相同聚合确实包含存储桶:

  1. "aggregations": {
  2. "level": {
  3. "doc_count_error_upper_bound": 0,"buckets": [
  4. {
  5. "key": "INFO","doc_count": 2691
  6. },{
  7. "key": "WARN","doc_count": 776
  8. },{
  9. "key": "ERROR","doc_count": 192
  10. }
  11. ]
  12. }

我100%确定搜索文档是相同的(从Java应用程序日志中复制它).

问:什么可能导致这种差异?

编辑
我构建查询的java代码是(包含很多对其他类的引用):

  1. // Start building the search itself
  2. SearchRequestBuilder srch = client.prepareSearch(indices.toArray(new String[indices.size()]))
  3. .setTypes(types.toArray(new String[types.size()])).setFrom(0).setSize(0);
  4. // Conditional sort order
  5. if (t.getOrder() != null)
  6. srch.addSort(t.getOrder().getBuilder());
  7. // Add aggregationbuilders to this search
  8. for (NivoStatistic stat : t.getStatistics())
  9. {
  10. logger.log(Level.FINER,"Adding statistic {0}",stat.getName());
  11. srch.addAggregation(stat.getContent());
  12. }
  13. // Use a search template
  14. NivoQuery qry = t.getQuery();
  15. SearchTemplateRequestBuilder srchTemplate = new SearchTemplateRequestBuilder(client)
  16. .setRequest(srch.request())
  17. .setScript(qry.getTemplateString())
  18. .setScriptType(ScriptType.INLINE)
  19. .setScriptParams(qry.getParameterValues())
  20. ;
  21. logger.log(Level.FINER,"Prepared search: {0}",srchTemplate.request().getRequest().toString());

上一个日志语句的输出是我用来通过curl -XPOST进行POST的http:// localhost:9200 / …

后执行通过

  1. // Execute the search
  2. try
  3. {
  4. SearchResponse resp = srchTemplate.get().getResponse();
  5. logger.log(Level.FINER,"Search returned: {0}",resp.toString());
  6. if (resp.status() == RestStatus.OK && resp.getAggregations() != null)
  7. {
  8. for (Aggregation agg : resp.getAggregations().asList())
  9. {
  10. // Update response
  11. t.getResponse().addStat(new NivoStatsHit(agg));
  12. }
  13. }
  14. }
  15. catch (ElasticsearchException e)
  16. {
  17. throw new ApiException(ApiExceptionCode.SEARCH_10061,"Database error: " + e.getDetailedMessage());
  18. }
最佳答案
我开始用Elasticserach 5.6.3测试你的代码,虽然起初它看起来很可行,但我意识到并不那么容易.所有似乎都归结为搜索模板的使用.

代码的主要内容是您使用的搜索模板与聚合相结合.在我的测试中,也是,甚至大小和工作;-).不知道它对你有什么用.或者您可能没有意识到结果也会让您自己回复文档,因为它与您的帖子无关.您正在记录的查询看起来是正确的,但结果显示聚合,大小和来自被忽略.

所以,在这一点上,我开始研究为什么搜索模板和聚合似乎不起作用(fyi,resp.getAggregations()返回null).我发现了这个 – https://github.com/elastic/elasticsearch/issues/22766.

我尝试将搜索模板构建器与普通搜索请求组合在一起,但我失败了.

猜你在找的Java相关文章