Java代码
//构建查询对象
BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();
//匹配class等于1
List<QueryBuilder> must = boolQueryBuilder.must();
must.add(QueryBuilders.termQuery("class","1"));
//过滤年龄在1到5岁的
List<QueryBuilder> filter = boolQueryBuilder.filter();
filter.add(QueryBuilders.rangeQuery("age").gte(1).lte(5));
//设置分页,排序
SearchResponse searchResponse = client.prepareSearch("zz")
.setFrom(0)
.setSize(2)
.setQuery(boolQueryBuilder)
.addSort("id", SortOrder.DESC).get();
报错信息
java.lang.IllegalArgumentException: Fielddata is disabled on text fields by default. Set fielddata=true on [id] in order to load fielddata in memory by uninverting the inverted index. Note that this can however use significant memory
原因
1.大致就是说我在做聚合时,尝试用text字段进行排序,但是text是需要分词的,从es5开始就将text类型的字段的fielddata默认设置为false
2.从上面的话以及我的Java代码中可以看出我是用id在排序,所以我的id字段是text类型的
解决
1.integer类型可以直接排序,所以我只需要将id字段的映射类型指定为integer就行了
#指定映射类型
POST zz/rr/_mapping
{
"rr": {
"properties": {
"id": {"type": "integer"},
"name": {
"type": "text",
"analyzer": "ik_smart",
"search_analyzer": "ik_smart"
}
}
}
}
2.这里我是在ES的辅助管理工具kibana中进行的,并且在指定映射类型之前,最好先将之前的库删除,再重新创建
#删除库
DELETE zz
#创建库
PUT zz