首页 > 解决方案 > Spring Data Elasticsearch 返回空聚合桶

问题描述

我正在使用以下 Spring Boot 2.0.6.RELEASE 和 Spring Data Elasticsearch 3.0.11.RELEASE。

Elasticsearch 集群是 6.8.5 版本

我编写了一些 Java 代码来执行对索引进行聚合的查询,如下所示:

QueryBuilder bools = QueryBuilders.boolQuery().must(matchQuery("zip-code", 90402))
                                          .must(matchQuery("zip-plus-4", 2411));

AggregationBuilder streetAggregation = AggregationBuilders.terms("street").field("street.keyword").size(10000);

SearchRequestBuilder searchRequestBuilder = new SearchRequestBuilder(elasticsearchClient, SearchAction.INSTANCE)
                .setIndices("pallc_index") //
                .setTypes("pallc") //
                .setQuery(bools) //
                .setSize(0) //
                .setExplain(true) //
                .addAggregation(streetAggregation);

log.debug("srb : {}", searchRequestBuilder);

SearchResponse searchResponse = searchRequestBuilder.execute().actionGet();

log.debug("Search Response : {}", searchResponse);

记录查询的此代码段末​​尾的调试行转储以下 Elasticsearch 查询:

{
  "size" : 0,
  "query" : {
    "bool" : {
      "must" : [
        {
          "match" : {
            "zip-code" : {
              "query" : 90402,
              "operator" : "OR",
              "prefix_length" : 0,
              "max_expansions" : 50,
              "fuzzy_transpositions" : true,
              "lenient" : false,
              "zero_terms_query" : "NONE",
              "boost" : 1.0
            }
          }
        },
        {
          "match" : {
            "zip-plus-4" : {
              "query" : 2411,
              "operator" : "OR",
              "prefix_length" : 0,
              "max_expansions" : 50,
              "fuzzy_transpositions" : true,
              "lenient" : false,
              "zero_terms_query" : "NONE",
              "boost" : 1.0
            }
          }
        }
      ],
      "disable_coord" : false,
      "adjust_pure_negative" : true,
      "boost" : 1.0
    }
  },
  "explain" : true,
  "aggregations" : {
    "street" : {
      "terms" : {
        "field" : "street.keyword",
        "size" : 10000,
        "min_doc_count" : 1,
        "shard_min_doc_count" : 0,
        "show_term_doc_count_error" : false,
        "order" : [
          {
            "_count" : "desc"
          },
          {
            "_term" : "asc"
          }
        ]
      }
    }
  }
}

如果我使用 Postman(或 curl)执行此查询,那么我会从 Elasticsearch 获得以下响应:

{
    "took": 2,
    "timed_out": false,
    "_shards": {
        "total": 5,
        "successful": 5,
        "skipped": 0,
        "failed": 0
    },
    "hits": {
        "total": 18,
        "max_score": 0.0,
        "hits": []
    },
    "aggregations": {
        "street": {
            "doc_count_error_upper_bound": 0,
            "sum_other_doc_count": 0,
            "buckets": [
                {
                    "key": "20TH",
                    "doc_count": 18
                }
            ]
        }
    }
}

可以看出,对于“street”返回了一个聚合桶,其键为“20TH”。

如果我尝试检查 Java 代码的响应,我可以看到聚合但存储桶是空的。

这是与 Java 代码中的搜索响应调试相关的日志行:

15:32:53.144 DEBUG [http-nio-20004-exec-1] com.smoltech.service.PallcAddressService - Search Response : {"took":8,"timed_out":false,"_shards":{"total":5,"successful":5,"skipped":0,"failed":0},"hits":{"total":0,"max_score":0.0,"hits":[]},"aggregations":{"street":{"doc_count_error_upper_bound":0,"sum_other_doc_count":0,"buckets":[]}}}

另一件奇怪的事情是,在 Java 代码的结果中(基本上与 Postman 运行相同的查询)它显示 0 个命中,而 Postman 返回 18 个命中。

我做错了什么?

标签: spring-bootelasticsearchspring-data

解决方案


如果有疑问 - 检查您的配置,然后再次检查!我意识到在执行 Java 代码时我使用了错误的 Spring 配置文件,这意味着我指向了错误的 ES 集群!

我的编辑回复:0 次点击与 18 次点击是我需要的线索......


推荐阅读