使用Java实现Elasticsearch的分组功能

来源:互联网 发布:九云图软件 编辑:程序博客网 时间:2024/06/06 05:07

ES上有如下数据


如果想根据class对student进行分组

GET school/student/_search?search_type=count{"aggs": {  "class": {    "terms": {      "field": "class",      "size": 100    }  } }
搜索结果:

结果被放入到buckets中,key=1表示class的值为1(对class进行分组),doc_count为class=1的文档数,如果想用java代码实现此功能呢?


1.创建带分组的搜索方法

public class ElasticsearchUtils {    private Client client;    public ElasticsearchUtils(String clusterName, String ipAddress) {        Settings settings = ImmutableSettings                .settingsBuilder()                //设置集群名称                 .put("cluster.name", clusterName)                .put("client.transport.ignore_cluster_name", false)                .put("node.client", true).put("client.transport.sniff", true)                .build();        client = new TransportClient(settings)                .addTransportAddress(new InetSocketTransportAddress(ipAddress,                        9300));/**     * 执行搜索(带分组)     * @param indexName 索引名称     * @param typeName 类型名称     * @param queryBuilder 查询内容     * @param aggsField 要分组的字段     * @return     */    public Map<String, String> searcher(String indexName, String typeName,            QueryBuilder queryBuilder, String aggsField) {        SearchRequestBuilder searchRequestBuilder = client                .prepareSearch(indexName).setTypes(typeName)                .setQuery(queryBuilder);        //创建TermsBuilder对象,使用term查询,设置该分组的名称为aggs-class,并根据aggsField字段进行分组        TermsBuilder termsBuilder = AggregationBuilders.terms("aggs-class")                .field(aggsField);//此处也可继续设置order、size等        //添加分组信息        searchRequestBuilder.addAggregation(termsBuilder);        //执行搜索        SearchResponse searchResponse = searchRequestBuilder.execute()                .actionGet();        //解析返回数据,获取分组名称为aggs-class的数据        Terms terms = searchResponse.getAggregations().get("aggs-class");        Collection<Terms.Bucket> buckets = terms.getBuckets();        Map<String, String> dataMap = new HashMap<String, String>();        for (Terms.Bucket bucket : buckets) {            String key = bucket.getKey();            dataMap.put(key, bucket.getDocCount() + "");        }        return dataMap;    } }

2.main函数

public class AggregationTest {    public static void main(String[] args) {        //创建对象,设置集群名称和IP地址        ElasticsearchUtils es = new ElasticsearchUtils("im_shanmenglu",                "localhost");        String indexName = "school";//索引名称        String typeName = "student";//类型名称        String aggsField = "class";//要分组的字段        //分组搜索        Map<String, String> dataMap = es.searcher(indexName, typeName, null,            aggsField);        //解析结果        for (Map.Entry<String, String> entry : dataMap.entrySet()) {            System.out.println("class = " + entry.getKey() + ", Value = "                    + entry.getValue());        }        //输出class = 2, Value = 2(class=2的数据有2条)        //   class = 1, Value = 5(class=1的数据有5条)    }}



0 0