版权声明:本文为博主原创文章,未经博主允许不得转载 https://blog.csdn.net/weixin_43841760/article/details/84643236
Elasticsearch中文名聚合分组
在用Elasticsearch对中文字段进行聚合统计的时候,出现中文被分词的情况,这个时候需要设置需要被聚合字段的mapping属性。
请求地址: http://192.168.0.1:9200/index/_mapping/type/
{
"properties": {
"author": {
"type": "text",
"fielddata" : true,
"fields": {"raw": {"type": "keyword"}}
}
}
}
在java代码里调用
public JSONArray queryRelation(Integer evnetId) {
Client client = ElasticsearchWrapper.getTransportClient();
BoolQueryBuilder bq = QueryBuilders.boolQuery();
bq.must(QueryBuilders.matchQuery("eventId", evnetId));
bq.must(QueryBuilders.matchQuery("docType", "event"));
TermsAggregationBuilder authorTermsBuilder = AggregationBuilders.terms("authorAgg").size(100)
.field("author.keyword");
SearchResponse sr = client.prepareSearch(indexName).setTypes(esType).setSearchType(SearchType.QUERY_THEN_FETCH)
.setQuery(bq).addAggregation(authorTermsBuilder).execute().actionGet();
StringTerms hhf = sr.getAggregations().get("authorAgg");
JSONArray jsonArray = new JSONArray();
for (StringTerms.Bucket bb : hhf.getBuckets()) {
JSONObject json = new JSONObject();
json.put("name", bb.getKey());
json.put("value", bb.getDocCount());
jsonArray.add(json);
}
return jsonArray;
}
返回结果效果:
[ {
"name" : "魔都之家",
"value" : 34
}, {
"name" : "TG实习狗",
"value" : 19
}, {
"name" : "上海温度",
"value" : 19
}, {
"name" : "拾实咨询",
"value" : 14
}, {
"name" : "宝山就业",
"value" : 13
}, {
"name" : "成长无忧选好课",
"value" : 11
}, {
"name" : "浦东国际人才城",
"value" : 10
}]