es聚合报错Elasticsearch exception [type=search_phase_execution_exception, reason=all shards failed

Exception in thread "main" ElasticsearchStatusException[Elasticsearch exception 
[type=search_phase_execution_exception, reason=all shards failed]]; nested: 
ElasticsearchException[Elasticsearch exception [type=illegal_argument_exception, 
reason=Fielddata is disabled on text fields by default. Set fielddata=true on 
[content_type] in order to load fielddata in memory by uninverting the inverted index.
 Note that this can however<br /> use significant memory. Alternatively use a keyword 
 field instead.]]; nested: ElasticsearchException[Elasticsearch exception 
 [type=illegal_argument_exception, reason=Fielddata is disabled on ext fields by default. 
 Set fielddata=true on [content_type] in order to load fielddata in memory by uninverting
  the inverted index. Note that this can however use significant memory. Alternatively 
  use a keyword field instead.]];

这个原因是因为我的分组聚合查询的字符串(content_type)类型是text类型

img

原因分析:

当使用到term 查询的时候,由于是精准匹配,所以查询的关键字在es上的类型,必须是keyword而不能是text,比如你的搜索条件是 ”name”:”蔡虚坤”,那么该name 字段的es类型得是keyword,而不能是text

在es中,只有keyword类型的字符串可以使用AggregationBuilders.terms(“aggs-class”)来分组聚合,想要分组查询,指定根据分组字段的keyword属性就可以了(如下图);

img

在我们的Java代码中怎么修改呢如下,加上".keyword"就可以了

img

之前的报错下面追加上:

img

img
我的解决方案:

SearchSourceBuilder searchSourceBuilder = new SearchSourceBuilder();
        //queryAll
        QueryBuilder queryAll = QueryBuilders.matchAllQuery();
        RangeQueryBuilder rangeQueryBuilder = QueryBuilders.rangeQuery("timestamp").gte(fordControlListReq.getStartTime()).lte(fordControlListReq.getEndTime()).format("epoch_millis");
        BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery().must(queryAll).must(rangeQueryBuilder);
        searchSourceBuilder.query(boolQueryBuilder);
        searchSourceBuilder.size(1000);
        searchSourceBuilder.sort("timestamp", SortOrder.DESC);
        AggregationBuilder calSum2 = AggregationBuilders.cardinality("phoneNum").field("phoneNum.keyword");
        AggregationBuilder aggregationBuilder = AggregationBuilders.dateHistogram("date_histogram")
                .field("timestamp")
                .interval(JdDateUtil.calInterval(fordControlListReq.getStartTime(),fordControlListReq.getEndTime()))
                .timeZone(DateTimeZone.getDefault()).subAggregation(calSum2);
        searchSourceBuilder.aggregation(aggregationBuilder);
        //执行查询
        SearchRequest searchRequest = new SearchRequest("app_api_request_log", "").source(searchSourceBuilder);
        SearchResponse response = null;

AggregationBuilders.cardinality(“phoneNum”).field(“phoneNum.keyword”);

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值