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”);

Logo

一站式 AI 云服务平台

更多推荐