带聚合的es复杂查询

import java.net.InetAddress;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.elasticsearch.action.get.GetRequest;
import org.elasticsearch.action.get.GetResponse;
import org.elasticsearch.action.search.SearchRequestBuilder;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.action.search.SearchType;
import org.elasticsearch.client.Client;
import org.elasticsearch.client.transport.TransportClient;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.text.Text;
import org.elasticsearch.common.transport.InetSocketTransportAddress;
import org.elasticsearch.index.query.BoolQueryBuilder;
import org.elasticsearch.index.query.QueryBuilders;
import org.elasticsearch.index.query.QueryStringQueryBuilder;
import org.elasticsearch.index.query.QueryStringQueryBuilder.Operator;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.aggregations.AggregationBuilders;
import org.elasticsearch.search.aggregations.bucket.terms.Terms;
import org.elasticsearch.search.highlight.HighlightField;
import org.elasticsearch.search.sort.SortOrder;
        
    /**    
     * 类名称:  ESUtil     
     * 描述:  es工具类  
     *  
     */    
    public class T {    
        private Client client;    
        
        {    
            Settings settings = Settings.settingsBuilder().build();    
            try {    
                client = TransportClient.builder().settings(settings).build()    
                        .addTransportAddress(new InetSocketTransportAddress(InetAddress.getByName("xxx.xxx.xxx.xxx"), 9300));    
            } catch (Exception e) {    
                e.printStackTrace();    
            }    
        }    
        
        /**  
         * 查询  
         */    
        public long query(String keyWord, String stDate, String enDate, String dataType, int currentPage, int rowNum,    
                List<Map<String, Object>> list) {    
        
            long num = 0;    
            QueryStringQueryBuilder queryBuilders = QueryBuilders.queryStringQuery(keyWord).defaultOperator(Operator.AND).field("full_name");  
        
        
            BoolQueryBuilder boolQueryBuilder = QueryBuilders.boolQuery();    
            boolQueryBuilder.must(queryBuilders);    
            boolQueryBuilder.filter(QueryBuilders.boolQuery().must(    
                    QueryBuilders.rangeQuery("logdate").gte(stDate).lte(enDate).format("yyyy-MM-dd HH:mm:ss")));    
        
            SearchRequestBuilder searchRequestBuilder = client.prepareSearch("logstash-2").setTypes("biglog")    
                    .setSearchType(SearchType.DFS_QUERY_THEN_FETCH)    
                    .setQuery(boolQueryBuilder)
                    .addAggregation(AggregationBuilders.terms("terms1_count").field("field1")) 
                    //Terms Aggregation  名称为terms1_count 字段为field1   下面的也类似
                    .addAggregation(AggregationBuilders.terms("terms2_count").field("field2"));    
        
            searchRequestBuilder.addHighlightedField("*");    
        
            SearchResponse response = searchRequestBuilder.setHighlighterPreTags("<font color='red'>")    
                    .setHighlighterPostTags("</font>").setHighlighterFragmentSize(10000000).setHighlighterRequireFieldMatch(false)  
                    .setFrom((currentPage - 1) * rowNum).setSize(rowNum).addSort("logdate", SortOrder.DESC)    
                    .setExplain(true).get();    
        

            //遍历聚会内容
            Terms  terms1Count = response.getAggregations().get("terms1_count");

            for (Terms.Bucket entry : terms1Count.getBuckets()) {
                String key = entry.getKeyAsString();          
                long docCount = entry.getDocCount();       
                
                System.out.println(key);
                 System.out.println(docCount);
            }
            Terms  terms2Count = response.getAggregations().get("terms2_count");
            
            for (Terms.Bucket entry : terms2Count.getBuckets()) {
                String key = entry.getKeyAsString();        
                long docCount = entry.getDocCount();        
                
                System.out.println(key);
                System.out.println(docCount);
            }

            SearchHits hits = response.getHits();    
            num = hits.getTotalHits();    
            System.out.println("总量" + hits.getTotalHits());    
            SearchHit[] hitArray = hits.hits();    
            for (SearchHit hit : hitArray) {    
                Map<String, Object> map = hit.getSource();    
                Map<String, HighlightField> highlightFields = hit.getHighlightFields();    
        
                // 打印高亮显示内容    
                for (Map.Entry<String, HighlightField> entry : highlightFields.entrySet()) {    
                    StringBuilder sb = new StringBuilder();    
                    Text[] text = entry.getValue().fragments();    
                    for (Text str : text) {    
                        sb.append(str.string());    
                    }    
        
                    map.put(entry.getKey(), sb.toString());    
                }    
        
                list.add(map);    
            }    
        
            return num;    
        }    
        
        /**  
         * 根据id查询  
         */    
        public Map<String, Object> queryById(String id) {    
        
            GetResponse response = client.get(new GetRequest("logstash-2", "biglog", id)).actionGet();    
            if (!response.isSourceEmpty()) {    
                return response.getSource();    
            }    
            return null;    
        }    
        
        public static void main(String[] args) {    
            ESUtil es = new ESUtil();    
        
            /*  
             * Map<String, Object> map = es.queryById("yu6ZUeu31vUcAW6s6eh"); System.out.println(JSON.toJSONString(map));  
             */    
        
            es.query("测试  看看", "2017-02-17 17:12:07", "2017-02-19 17:21:08",    
                    null, 5, 10, new ArrayList<Map<String, Object>>());    
        }    
    }    




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值