【第004篇】Elasticsearch在Java中的应用

import io.renren.common.constant.Constant;
import io.renren.common.page.PageData;
import io.renren.modules.homestead.service.*;
import io.renren.modules.security.user.SecurityUser;
import io.renren.modules.util.StringUtils;
import org.elasticsearch.action.search.SearchRequest;
import org.elasticsearch.action.search.SearchResponse;
import org.elasticsearch.client.RequestOptions;
import org.elasticsearch.client.RestHighLevelClient;
import org.elasticsearch.index.query.*;
import org.elasticsearch.search.SearchHit;
import org.elasticsearch.search.SearchHits;
import org.elasticsearch.search.builder.SearchSourceBuilder;
import org.elasticsearch.search.sort.SortOrder;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;

import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
     * 根据区划从es中获取农户台账列表数据
     *
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public PageData<Map<String, Object>> loadHomesteadHousehold(Map<String, Object> params) throws Exception {
        //当前页码
        Integer curPage = Integer.parseInt(StringUtils.checkObj2Str(params.get(Constant.PAGE), "1"));
        //每页展示条数
        Integer limit = Integer.parseInt(StringUtils.checkObj2Str(params.get(Constant.LIMIT), "10"));

        //行政区划
        String regionId = StringUtils.checkObj2Str(params.get("regionId"));
        if (StringUtils.isEmpty(regionId)) {// 当未选择行政区划,则使用当前登录人行政区划
            regionId = SecurityUser.getRegionId().toString();
        }

        List<Map<String, Object>> list = null;
        if (StringUtils.isEmpty(regionId)) {
            list = new ArrayList<Map<String, Object>>();
            return new PageData<Map<String, Object>>(list, 0);
        }

        // 1.从es中查询农户台账数据
        SearchRequest searchRequest = new SearchRequest();
        searchRequest.indices("homestead_household");

        SearchSourceBuilder sourceBulider = new SearchSourceBuilder();

        //添加分页条件
        sourceBulider.from(limit * (curPage - 1));// 表示从第几条查询
        sourceBulider.size(limit);//表示每次查询几条数据
        //排序
        sourceBulider.sort("village_code.keyword", SortOrder.ASC).sort("household_code.keyword", SortOrder.ASC);

        //2.构建boolQuery
        BoolQueryBuilder query = QueryBuilders.boolQuery();
        //3.构建各个查询条件
        //3.1 行政区划
        PrefixQueryBuilder termQuery1 = QueryBuilders.prefixQuery("village_code", regionId.toString());
        query.must(termQuery1);
        //3.2 数据来源(1:来自宅基地,2:来自运行监测)
        QueryBuilder termQuery2 = QueryBuilders.termQuery("datasource", "1");
        query.must(termQuery2);

        //4.使用boolQuery连接
        sourceBulider.query(query);
        searchRequest.source(sourceBulider);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        // 结果集
        list = Stream.of(searchResponse.getHits().getHits()).map(SearchHit::getSourceAsMap).collect(Collectors.toList());
        if (StringUtils.isNotEmpty(list) && list.size() > 0) {
            Map<String, Object> map = null;
            String villageCode = "";//农户村级行政区划
            String householdCode = "";//农户代码
            String xuHao = "";//序号
            String villageName = "";//农户村级行政区划名称
            String parentRegionName = "";//上级行政区划名称
            for (int i = 0; i < list.size(); i++) {
                map = list.get(i);
                xuHao = "";
                householdCode = StringUtils.checkObj2Str(map.get("household_code"));
                if (StringUtils.isNotEmpty(householdCode) && householdCode.length() >= 4) {
                    xuHao = householdCode.substring(householdCode.length() - 4);
                } else {
                    xuHao = householdCode;
                }
                map.put("xu_hao", xuHao);

                //根据村级行政区划获取村级行政区划名称和上级行政区划名称
                villageCode = StringUtils.checkObj2Str(map.get("village_code"));
                villageName = regionService.getRegionName(Long.parseLong(villageCode));//村级名称
                map.put("village_name", villageName);
                parentRegionName = regionService.getParentRegionName(Long.parseLong(villageCode));//上级名称
                map.put("parent_region_name", parentRegionName);
            }
        }
        //获取总记录数
        SearchHits searchHits = searchResponse.getHits();
        long total = searchHits.getTotalHits().value;
        PageData<Map<String, Object>> pageData = new PageData(list, total);
        return pageData;
    }
/**
     * 根据区划从es中获取村级台账列表数据
     *
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public PageData<Map<String, Object>> loadHomesteadRegionCun(Map<String, Object> params) throws Exception {
        String regionLevel = "5";//区域级别(1-省;2-市;3-县;4-乡;5-村)
        // 当前页码
        Integer curPage = Integer.parseInt(StringUtils.checkObj2Str(params.get(Constant.PAGE), "1"));
        //每页展示条数
        Integer limit = Integer.parseInt(StringUtils.checkObj2Str(params.get(Constant.LIMIT), "10"));

        //行政区划
        String regionId = StringUtils.checkObj2Str(params.get("regionId"));
        if (StringUtils.isEmpty(regionId)) {// 当未选择行政区划,则使用当前登录人行政区划
            regionId = SecurityUser.getRegionId().toString();
        }

        List<Map<String, Object>> list = null;
        if (StringUtils.isEmpty(regionId)) {
            list = new ArrayList<Map<String, Object>>();
            return new PageData<Map<String, Object>>(list, 0);
        }

        String name = "";//字段名称
        String value = "";//字段值
        if (regionId.length() == 2) {// 省
            name = "province_code";
            value = regionId;
        } else if (regionId.length() == 4) {//市
            name = "city_code";
            value = regionId;
        } else if (regionId.length() == 6) {//县
            name = "county_code";
            value = regionId;
        } else if (regionId.length() == 9) {//乡
            name = "town_code";
            value = regionId;
        } else if (regionId.length() == 12) {//村
            name = "village_code";
            value = regionId;
        }

        if (StringUtils.isEmpty(name)) {
            list = new ArrayList<Map<String, Object>>();
            return new PageData<Map<String, Object>>(list, 0);
        }

        // 1.从es中查询区域台账数据
        SearchRequest searchRequest = new SearchRequest("homestead_region_index");

        SearchSourceBuilder sourceBulider = new SearchSourceBuilder();
        //添加分页条件
        sourceBulider.from(limit * (curPage - 1));// 表示从第几条查询
        sourceBulider.size(limit);//表示每次查询几条数据

        //2.构建boolQuery
        BoolQueryBuilder query = QueryBuilders.boolQuery();
        //3.构建各个查询条件
        //3.1 行政区划
        QueryBuilder termQuery1 = QueryBuilders.termQuery(name, value);
        query.must(termQuery1);
        //3.2 限制行政级别
        QueryBuilder termQuery2 = QueryBuilders.termQuery("region_level", regionLevel);
        query.must(termQuery2);
        //3.3 数据来源(1:来自宅基地,2:来自运行监测)
        QueryBuilder termQuery3 = QueryBuilders.termQuery("datasource", "1");
        query.must(termQuery3);

        //4.使用boolQuery连接
        sourceBulider.query(query);
        searchRequest.source(sourceBulider);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        // 结果集
        list = Stream.of(searchResponse.getHits().getHits()).map(SearchHit::getSourceAsMap).collect(Collectors.toList());
        if (StringUtils.isNotEmpty(list) && list.size() > 0) {
            Map<String, Object> map = null;
            String villageCode = "";//村区域代码
            String villageName = "";//村区域名称
            String parentRegionName = "";//上级行政区划名称
            for (int i = 0; i < list.size(); i++) {
                map = list.get(i);
                villageCode = StringUtils.checkObj2Str(map.get("village_code"));//村区域代码
                villageName = regionService.getRegionName(Long.parseLong(villageCode));//村区域名称
                map.put("village_name", villageName);
                parentRegionName = regionService.getParentRegionName(Long.parseLong(villageCode));//上级名称
                map.put("parent_region_name", parentRegionName);
            }
        }

        //获取总记录数
        SearchHits searchHits = searchResponse.getHits();
        long total = searchHits.getTotalHits().value;

        PageData<Map<String, Object>> pageData = new PageData(list, total);
        return pageData;
    }
/**
     * 根据区划从es中获取日增统计列表数据
     *
     * @param params
     * @return
     * @throws Exception
     */
    @Override
    public PageData<Map<String, Object>> loadHomesteadDaily(Map<String, Object> params) throws Exception {
        // 当前页码
        Integer curPage = Integer.parseInt(StringUtils.checkObj2Str(params.get(Constant.PAGE), "1"));
        //每页展示条数
        Integer limit = Integer.parseInt(StringUtils.checkObj2Str(params.get(Constant.LIMIT), "10"));

        //查询的时间
        String stat_date=StringUtils.checkObj2Str(params.get("stat_date"));


        //行政区划
        String regionId = StringUtils.checkObj2Str(params.get("regionId"));
        if (StringUtils.isEmpty(regionId)) {// 当未选择行政区划,则使用当前登录人行政区划
            regionId = SecurityUser.getRegionId().toString();
        }

        List<Map<String, Object>> list = null;
        if (StringUtils.isEmpty(regionId)) {
            list = new ArrayList<Map<String, Object>>();
            return new PageData<Map<String, Object>>(list, 0);
        }

        String name = "";//字段名称
        String value = "";//字段值
        String regionLevel = "";//区域级别(1-省;2-市;3-县;4-乡;5-村)
        String key = "";//列名
        if (regionId.length() == 2) {// 省
            name = "province_code";
            value = regionId;
            regionLevel = "2";
            key = "city_code";
        } else if (regionId.length() == 4) {//市
            name = "city_code";
            value = regionId;
            regionLevel = "3";
            key = "county_code";
        } else if (regionId.length() == 6) {//县
            name = "county_code";
            value = regionId;
            regionLevel = "4";
            key = "town_code";
        } else if (regionId.length() == 9) {//乡
            name = "town_code";
            value = regionId;
            regionLevel = "5";
            key = "village_code";
        } else if (regionId.length() == 12) {//村
            name = "village_code";
            value = regionId;
            regionLevel = "5";
            key = "village_code";
        }

        if (StringUtils.isEmpty(name)) {
            list = new ArrayList<Map<String, Object>>();
            return new PageData<Map<String, Object>>(list, 0);
        }

        // 1.从es中查询区域台账数据
        SearchRequest searchRequest;
        String currDate = DateUtils.formatShortDate(new Date());
        String searchDate = StringUtils.checkObj2Str(params.get("searchDate"));
        if (StringUtils.isEmpty(searchDate) || searchDate.equals(currDate)) {// 表示不是今天,此时应该查询历史记录
        	searchRequest = new SearchRequest("homestead_daily");
        }else{
        	searchRequest = new SearchRequest("homestead_daily_index_history");
        }
        SearchSourceBuilder sourceBulider = new SearchSourceBuilder();
        //添加分页条件
        sourceBulider.from(limit * (curPage - 1));// 表示从第几条查询
        sourceBulider.size(limit);//表示每次查询几条数据

        //2.构建boolQuery
        BoolQueryBuilder query = QueryBuilders.boolQuery();

        //3.构建各个查询条件
        //3.1 行政区划
        QueryBuilder termQuery1 = QueryBuilders.termQuery(name, value);
        query.must(termQuery1);
        //3.2 限制行政级别
        QueryBuilder termQuery2 = QueryBuilders.termQuery("region_level", regionLevel);
        query.must(termQuery2);
        //3.2 限制数据时间
        if(StringUtils.isNotEmpty(searchDate) && !searchDate.equals(currDate)){//当不为空的时候进行条件拼接
            stat_date=stat_date.replace("-","");
            QueryBuilder termQuery3 = QueryBuilders.termQuery("stat_date", stat_date);
            query.must(termQuery3);
        }

        //4.使用boolQuery连接
        sourceBulider.query(query);
        sourceBulider.sort(key+".keyword",SortOrder.ASC);//es string类型不支持聚合,需要指定keyword类型
        searchRequest.source(sourceBulider);
        SearchResponse searchResponse = restHighLevelClient.search(searchRequest, RequestOptions.DEFAULT);

        // 结果集
        list = Stream.of(searchResponse.getHits().getHits()).map(SearchHit::getSourceAsMap).collect(Collectors.toList());
        if (StringUtils.isNotEmpty(list) && list.size() > 0) {
            Map<String, Object> map = null;
            String regionCode = "";//村区域代码
            String regionName = "";//农户村级行政区划名称
            String parentRegionName = "";//上级行政区划名称
            for (int i = 0; i < list.size(); i++) {
                map = list.get(i);
                regionCode = StringUtils.checkObj2Str(map.get(key));
                regionName = regionService.getRegionName(Long.parseLong(regionCode));
                map.put("region_code", regionCode);
                map.put("region_name", regionName);
            }
        }

        //获取总记录数
        SearchHits searchHits = searchResponse.getHits();
        long total = searchHits.getTotalHits().value;

        PageData<Map<String, Object>> pageData = new PageData(list, total);
        return pageData;
    }
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

嘉&年华

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值