zoukankan      html  css  js  c++  java
  • ElasticSearch使用ElasticsearchTemplate整合spring

    1、首先引进maven依赖

    <dependency>    
               <groupId>org.springframework.data</groupId>    
                <artifactId>spring-data-elasticsearch</artifactId>    
                <version>2.0.2.RELEASE</version>    
    </dependency>

    2.配置es.properties

    #默认即为elasticsearch
    elasticsearch_cluster_name=elasticsearch
    #配置es节点信息,逗号分隔,如果没有指定,则启动ClientNode
    elasticsearch_cluster_nodes=172.16.30.56:19300,172.16.30.126:19300

    3.配置applicationContext-es.xml,整合spring

    <?xml version="1.0" encoding="UTF-8"?>
    <beans xmlns="http://www.springframework.org/schema/beans"
        xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
        xmlns:elasticsearch="http://www.springframework.org/schema/data/elasticsearch"
        xmlns:context="http://www.springframework.org/schema/context"
        xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
                                http://www.springframework.org/schema/data/elasticsearch http://www.springframework.org/schema/data/elasticsearch/spring-elasticsearch.xsd
                                http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context.xsd">
        <elasticsearch:transport-client id="client"
            cluster-nodes="${elasticsearch_cluster_nodes}" cluster-name="${elasticsearch_cluster_name}" />//对应es.properties中的数据
    
        <bean name="elasticsearchTemplate"
            class="org.springframework.data.elasticsearch.core.ElasticsearchTemplate">
            <constructor-arg ref="client" />
        </bean>
    </beans>

    4、导入、注入ElasticsearchTemplate

    import org.springframework.data.elasticsearch.core.ElasticsearchTemplate;//导入包
        @Autowired(required=false)
        private ElasticsearchTemplate esTemplate; 

    5、新增或者更新数据到ES

        //增加或者更新
        public ReturnResult addEsCashInfo(String cashId, String type) throws Exception {
            ReturnResult result = new ReturnResult();
            if (StringUtils.isBlank(cashId)) {
                String msg = "cashId不能为空";
                logger.info(msg);
                throw new GmallException(msg);
            }
            logger.info("addEsCashInfo cashId=" + cashId + ",type=" + type);
            net.sf.json.JSONObject obj = new net.sf.json.JSONObject();
            if (SuperAppConstant.CASH_CALL_BACK_TYPE.equals(type)) {
                Cash cash = cashMapper.selectByPrimaryKey(cashId);
                obj = net.sf.json.JSONObject.fromObject(cash);
                CashEs cashEs = new CashEs();
                BeanUtils.copyProperties(cashEs, cash);
                IndexQuery indexQuery = new IndexQueryBuilder().withIndexName(SuperAppConstant.ES_INDEX_NAME)
                        .withType(SuperAppConstant.ES_CASH_TYPE).withId(cashId).withObject(cashEs).build();
                esTemplate.index(indexQuery);
            }else{
                String msg = "未知支付类型";
                logger.info(msg);
                throw new GmallException(msg);
            }
            result.setCode(ReturnCodeType.SUCCESS).setMessage("插入成功");
            return result;
    }

    6、查询ES中的数据

    ES查询语句

    {
        "query": {
            "bool": {
                "must": [{
                    "term": {
                        "state": 1
                    }
                }, {
                    "term": {
                        "appId": "99999999-9999-9999-9999-999999999999"
                    }
                }, {
                    "bool": {
                        "should": [{
                            "match": {
                                "payPlatform": {
                                    "query": "TL",
                                    "type": "boolean"
                                }
                            }
                        }, {
                            "match": {
                                "payPlatform": {
                                    "query": "TL_WX_APP",
                                    "type": "boolean"
                                }
                            }
                        }, {
                            "match": {
                                "payPlatform": {
                                    "query": "TL_ALI",
                                    "type": "boolean"
                                }
                            }
                        }, {
                            "match": {
                                "payPlatform": {
                                    "query": "TL_WX_JS",
                                    "type": "boolean"
                                }
                            }
                        }, {
                            "match": {
                                "payPlatform": {
                                    "query": "TL_APP",
                                    "type": "boolean"
                                }
                            }
                        }, {
                            "match": {
                                "payPlatform": {
                                    "query": "TL_WX_H5",
                                    "type": "boolean"
                                }
                            }
                        }, {
                            "match": {
                                "payPlatform": {
                                    "query": "WX_GWORLD",
                                    "type": "boolean"
                                }
                            }
                        }, {
                            "match": {
                                "payPlatform": {
                                    "query": "ALI_GWORLD",
                                    "type": "boolean"
                                }
                            }
                        }]
                    }
                }]
            }
        }
    }

    对应使用Java查询

    public Sum getEsPaySummaryInfo(String appId) throws Exception {
            SumBuilder sb = AggregationBuilders.sum("tpPrice").field("payPrice");
            BoolQueryBuilder bqb = QueryBuilders.boolQuery();
            bqb.must(QueryBuilders.termQuery("state",SuperAppConstant.PAY_STATUS_SUCCESS));
            bqb.must(QueryBuilders.termQuery("appId",appId));
            bqb.must(QueryBuilders.boolQuery()
                    .should(QueryBuilders.matchQuery("payPlatform", SuperAppConstant.PAY_PLATFORM_TL))
                    .should(QueryBuilders.matchQuery("payPlatform", SuperAppConstant.PAY_PLATFORM_TL_WX_APP))
                    .should(QueryBuilders.matchQuery("payPlatform", SuperAppConstant.PAY_PLATFORM_TL_ALI))
                    .should(QueryBuilders.matchQuery("payPlatform", SuperAppConstant.PAY_PLATFORM_TL_WX_JS))
                    .should(QueryBuilders.matchQuery("payPlatform", SuperAppConstant.PAY_PLATFORM_TL_APP))
                    .should(QueryBuilders.matchQuery("payPlatform", SuperAppConstant.PAY_PLATFORM_TL_WX_H5))
                    .should(QueryBuilders.matchQuery("payPlatform", SuperAppConstant.PAY_PLATFORM_WX_GWORLD))
                    .should(QueryBuilders.matchQuery("payPlatform", SuperAppConstant.PAY_PLATFORM_ALI_GWORLD))
                    );
            SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(bqb).withIndices(SuperAppConstant.ES_INDEX_NAME).withTypes(SuperAppConstant.ES_PAY_TYPE)
                    .withSearchType(SearchType.DEFAULT)
                    .addAggregation(sb).build();
            Aggregations aggregations = esTemplate.query(searchQuery, new ResultsExtractor<Aggregations>() {
                @Override
                public Aggregations extract(SearchResponse response) {
                    return response.getAggregations();
                }
            });
            Sum _sum = aggregations.get("tpPrice");
            if(_sum != null){
                logger.info("sum="+_sum.getValue());
            }
            return _sum;
        }

    7、聚合查询,分组求和(对应sql的group by)

    public Map getEsCashSummaryInfo(String appId) throws Exception {
            Map map = new HashMap<>();
            TermsBuilder tb = AggregationBuilders.terms("cash").field("appId");//appId 是分组字段名,cash是查询结果的别名
            SumBuilder sb = AggregationBuilders.sum("amount").field("paid");//paid是求和字段名称,amount是结果别名
            tb.subAggregation(sb);
            BoolQueryBuilder bqb = QueryBuilders.boolQuery();
            bqb.mustNot(QueryBuilders.termQuery("settled",SuperAppConstant.CASH_STATUS_CANCLED));
            bqb.must(QueryBuilders.termQuery("appId",appId));
            SearchQuery searchQuery = new NativeSearchQueryBuilder().withQuery(bqb).withIndices(SuperAppConstant.ES_INDEX_NAME).withTypes(SuperAppConstant.ES_CASH_TYPE)
                    .withSearchType(SearchType.DEFAULT)
                    .addAggregation(tb)
                    .build();
            Aggregations aggregations = esTemplate.query(searchQuery, new ResultsExtractor<Aggregations>() {
                @Override
                public Aggregations extract(SearchResponse response) {
                    return response.getAggregations();
                }
            });
            Terms term = aggregations.get("cash");//获取结果后进行解析
            if(term.getBuckets().size()>0){
                for (Bucket bk : term.getBuckets()) {
                    long count = bk.getDocCount();
                    //得到所有子聚合  
                    Map subaggmap = bk.getAggregations().asMap();  
                    //sum值获取方法  
                    double amount = ((InternalSum) subaggmap.get("amount")).getValue();  
                    map.put("count", count);
                    map.put("amount", amount);
                }
                return map;
            }else{
                return null;
            }
        }
  • 相关阅读:
    江城子 -- 地信四十二帅图
    Oracle11g配置st_geometry
    Thinkpad X1 Carbon 6th(2018)更换电池
    C#子线程更新主线程控件方法汇总
    在启用了Hyper-V的主机上运行 VM Workstation
    ArcGIS创建要素提示表已经被注册(Table already registered)
    WIN10安装Linux子系统以及设置
    Apache Tomcat 版本说明
    WindowsTerminal设置
    操作系统、软件版本号说明
  • 原文地址:https://www.cnblogs.com/ouyanxia/p/8288749.html
Copyright © 2011-2022 走看看