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类型
原因分析:
当使用到term 查询的时候,由于是精准匹配,所以查询的关键字在es上的类型,必须是keyword而不能是text,比如你的搜索条件是 ”name”:”蔡虚坤”,那么该name 字段的es类型得是keyword,而不能是text
在es中,只有keyword类型的字符串可以使用AggregationBuilders.terms(“aggs-class”)来分组聚合,想要分组查询,指定根据分组字段的keyword属性就可以了(如下图);
在我们的Java代码中怎么修改呢如下,加上".keyword"就可以了
之前的报错下面追加上:
我的解决方案:
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”);