zoukankan      html  css  js  c++  java
  • Elasticsearch+spring cloud201912301423

    <?xml version="1.0" encoding="UTF-8"?>
    <project xmlns="http://maven.apache.org/POM/4.0.0"
             xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
             xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
        <modelVersion>4.0.0</modelVersion>
    
        <groupId>com.elasticsearch</groupId>
        <artifactId>springboot-elasticsearch</artifactId>
        <version>1.0-SNAPSHOT</version>
    
        <name>springboot-elasticsearch</name>
        <description></description>
    
        <parent>
            <groupId>org.springframework.boot</groupId>
            <artifactId>spring-boot-starter-parent</artifactId>
            <version>2.0.4.RELEASE</version>
        </parent>
    
        <dependencies>
    
            <dependency>
                <groupId>javax.servlet</groupId>
                <artifactId>jstl</artifactId>
            </dependency>
            
            <dependency>
                <groupId>org.apache.tomcat.embed</groupId>
                <artifactId>tomcat-embed-jasper</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-starter-web</artifactId>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.elasticsearch/elasticsearch -->
            <dependency>
                <groupId>org.elasticsearch</groupId>
                <artifactId>elasticsearch</artifactId>
                <version>7.5.0</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.elasticsearch.client/transport -->
            <dependency>
                <groupId>org.elasticsearch.client</groupId>
                <artifactId>transport</artifactId>
                <version>7.5.0</version>
            </dependency>
    
            <dependency>
                <groupId>junit</groupId>
                <artifactId>junit</artifactId>
                <version>4.12</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.springframework.boot</groupId>
                <artifactId>spring-boot-test</artifactId>
                <version>2.0.3.RELEASE</version>
                <scope>test</scope>
            </dependency>
            <dependency>
                <groupId>org.springframework</groupId>
                <artifactId>spring-test</artifactId>
                <version>5.0.7.RELEASE</version>
                <scope>test</scope>
            </dependency>
    
            <dependency>
                <groupId>org.projectlombok</groupId>
                <artifactId>lombok</artifactId>
                <version>1.16.18</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/com.alibaba/fastjson -->
            <dependency>
                <groupId>com.alibaba</groupId>
                <artifactId>fastjson</artifactId>
                <version>1.2.54</version>
            </dependency>
    
            <!-- https://mvnrepository.com/artifact/org.elasticsearch.plugin/transport-netty4-client -->
            <dependency>
                <groupId>org.elasticsearch.plugin</groupId>
                <artifactId>transport-netty4-client</artifactId>
                <version>7.5.0</version>
            </dependency>
    
    
        </dependencies>
    
        <build>
            <plugins>
                <plugin>
                    <groupId>org.springframework.boot</groupId>
                    <artifactId>spring-boot-maven-plugin</artifactId>
                </plugin>
                <plugin>
                    <groupId>org.apache.maven.plugins</groupId>
                    <artifactId>maven-compiler-plugin</artifactId>
                    <configuration>
                        <source>1.8</source>
                        <target>1.8</target>
                    </configuration>
                </plugin>
            </plugins>
        </build>
    
    </project>

    pom.xml

    package org.jimmy.autosearch.config;
    
    import org.elasticsearch.action.bulk.BackoffPolicy;
    import org.elasticsearch.action.bulk.BulkProcessor;
    import org.elasticsearch.action.bulk.BulkRequest;
    import org.elasticsearch.action.bulk.BulkResponse;
    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.common.settings.Settings;
    import org.elasticsearch.common.transport.TransportAddress;
    import org.elasticsearch.common.unit.ByteSizeUnit;
    import org.elasticsearch.common.unit.ByteSizeValue;
    import org.elasticsearch.common.unit.TimeValue;
    import org.elasticsearch.transport.client.PreBuiltTransportClient;
    import org.slf4j.Logger;
    import org.slf4j.LoggerFactory;
    import org.springframework.context.annotation.Bean;
    import org.springframework.context.annotation.Configuration;
    import javax.annotation.PostConstruct;
    import java.net.InetAddress;
    import java.net.UnknownHostException;
    
    @Configuration
    @SuppressWarnings({ "resource", "deprecation" })
    public class ElasticSearchConfig {
    
        private static final Logger logger = LoggerFactory.getLogger(ElasticSearchConfig.class);
    
        private String host = "127.0.0.1";//elasticsearch的地址
    
        private Integer port = 9300;//elasticsearch的端口
    
        private String clusterName = "elasticsearch";//集群
    
        private TransportClient transportClient;
    
        @Bean
        public TransportClient transportClient(){
            Settings settings = Settings.builder()
                    .put("cluster.name", clusterName)
                    .build();
            try {
                transportClient = new PreBuiltTransportClient(settings)
                        .addTransportAddress(new TransportAddress(InetAddress.getByName(host), port));
            } catch (UnknownHostException e) {
                logger.error("创建elasticsearch客户端失败");
                e.printStackTrace();
            }
            logger.info("创建elasticsearch客户端成功");
            return transportClient;
        }
    
        @Bean
        public BulkProcessor bulkProcessor() throws UnknownHostException {
            Settings settings = Settings.builder()
                    .put("cluster.name", clusterName)
                    .build();
            TransportClient transportClient = new PreBuiltTransportClient(settings)
                    .addTransportAddress(new TransportAddress(InetAddress.getByName(host), port));
            return BulkProcessor.builder(transportClient, new BulkProcessor.Listener() {
                @Override
                public void beforeBulk(long l, BulkRequest bulkRequest) {
    
                }
    
                @Override
                public void afterBulk(long l, BulkRequest bulkRequest, BulkResponse bulkResponse) {
    
                }
    
                @Override
                public void afterBulk(long l, BulkRequest bulkRequest, Throwable throwable) {
                    logger.error("{} data bulk failed,reason :{}", bulkRequest.numberOfActions(), throwable);
                }
    
            }).setBulkActions(1000)//分批,每10000条请求当成一批请求。默认值为1000
                    .setBulkSize(new ByteSizeValue(5, ByteSizeUnit.MB))//每次5MB,刷新一次bulk。默认为5m
                    .setFlushInterval(TimeValue.timeValueSeconds(5))//每5秒一定执行,不管已经队列积累了多少。默认不设置这个值
                    .setConcurrentRequests(1)//设置并发请求数,如果是0,那表示只有一个请求就可以被执行,如果为1,则可以积累并被执行。默认为1.
                    .setBackoffPolicy(BackoffPolicy.exponentialBackoff(TimeValue.timeValueMillis(100), 3))//这里有个backoff策略,最初等待100ms,然后按照指数增长并重试3次。每当一个或者多个bulk请求失败,并出现EsRejectedExecutionException异常时.就会尝试重试。这个异常表示用于处理请求的可用计算资源太少。如果要禁用这个backoff策略,需要用backoff.nobackoff()。
                    .build();
        }
    
        @PostConstruct
        void init() {
            System.setProperty("es.set.netty.runtime.available.processors", "false");
        }
    
    }

    ElasticSearchConfig.java

    package org.jimmy.autosearch.service;
    
    import java.util.ArrayList;
    import java.util.HashMap;
    import java.util.List;
    import java.util.Map;
    import org.jimmy.autosearch.pojo.EsEntity;
    
    /**
     * 
     */
    public interface QueryService<T> {
    
        List<Map<String, Object>> queryListFromES(EsEntity es, int storeId, String storeName, String startDate, String endDate);
    
        ArrayList<T> findByParams(EsEntity es, HashMap<String, String> params);
        
    }

    QueryService.java

    package org.jimmy.autosearch.service.impl;
    
    import org.elasticsearch.action.search.SearchRequestBuilder;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.script.Script;
    import org.elasticsearch.script.ScriptType;
    import org.elasticsearch.search.SearchHits;
    import org.elasticsearch.search.aggregations.AggregationBuilders;
    import org.elasticsearch.search.aggregations.BucketOrder;
    import org.elasticsearch.search.aggregations.PipelineAggregatorBuilders;
    import org.elasticsearch.search.aggregations.bucket.terms.Terms;
    import org.elasticsearch.search.aggregations.metrics.Sum;
    import org.jimmy.autosearch.pojo.Article;
    import org.jimmy.autosearch.pojo.EsEntity;
    import org.jimmy.autosearch.service.QueryService;
    import org.springframework.stereotype.Service;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    
    import javax.annotation.Resource;
    import java.util.*;
    import java.util.Map.Entry;
    
    
    /**
     * Created by baishuai on 2018/12/18
     */
    @Service
    @SuppressWarnings("deprecation")
    public class ArticleQueryServiceImpl implements QueryService<Article> {
        
        @Resource
        TransportClient transportClient;//注入es操作对象
    
        @Override
        public ArrayList<Article> findByParams(EsEntity es, HashMap<String, String> params) {
            ArrayList<Article> articleList = new ArrayList<Article>();
            SearchRequestBuilder searchRequest = transportClient.prepareSearch(es.getIndex()).setTypes(es.getType());
            if(params != null){
                Set<Entry<String, String>> paramsEntry = params.entrySet();
                paramsEntry.forEach(param -> {
                    searchRequest.setQuery(QueryBuilders.boolQuery().must(QueryBuilders.termQuery(param.getKey() + ".keyword", param.getValue())));
                });
            }
            SearchResponse searchResponse = searchRequest.execute().actionGet();
            SearchHits hits = searchResponse.getHits();
            hits.forEach(h -> {
                if(h != null && h.getSourceAsString() != null
                    && h.getSourceAsString().trim().length() > 0){
                    String content = h.getSourceAsString();
                    JSONObject jsonObject = JSONObject.parseObject(content);
                    Article article = JSON.toJavaObject(jsonObject, Article.class);
                    articleList.add(article);
                }
            });
            return articleList;
        }
        
        public HashMap<String, Object> paging(ArrayList<Article> articleList, Integer page, Integer size){
            HashMap<String, Object> map = new HashMap<String, Object>();
            if(page == null){
                page = 0;
            }
            if(size == null){
                size = 10;
            }
            int count = articleList.size();
            int maxPageSize = 0;
            if(count > 0){
                maxPageSize = (count - 1) / size + 1;
            }
            ArrayList<Article> list = new ArrayList<Article>();
            int beginIndex = page * size;
            int endIndex = (page + 1) * size > count ? count : (page + 1) * size;
            for(int i = beginIndex; i < endIndex; i++){
                list.add(articleList.get(i));
            }
            map.put("list", list);
            map.put("page", page);
            map.put("size", size);
            map.put("maxPageSize", maxPageSize);
            return map;
        }
        
        @Override
        public List<Map<String, Object>> queryListFromES(EsEntity es, int storeId, String storeName, String startDate, String endDate) {
    
            List<Map<String, Object>> list = new ArrayList<>();
    
            Map<String,Object> map = Collections.emptyMap();
    
            Script script = new Script(ScriptType.INLINE, "painless","params._value0 > 0",map);  //提前定义好查询销量是否大于1000的脚本,类似SQL里面的having
    
            long beginTime = System.currentTimeMillis();
    
            SearchResponse sr = transportClient.prepareSearch(es.getIndex()).setTypes(es.getType()) //要查询的表
                    .setQuery(QueryBuilders.boolQuery()
                            .must(QueryBuilders.termQuery("store_id", storeId))  //挨个设置查询条件,没有就不加,如果是字符串类型的,要加keyword后缀
                            .must(QueryBuilders.termQuery("store_name.keyword", storeName))
                            .must(QueryBuilders.rangeQuery("pay_date.keyword").gte(startDate).lte(endDate))
                    ).addAggregation(
                            AggregationBuilders.terms("by_product_code").field("product_code.keyword").size(2000) //按货号分组,最多查500个货号.SKU直接改字段名字就可以
                                            .subAggregation(AggregationBuilders.sum("quantity").field("quantity"))  //分组计算销量汇总
                                            .subAggregation(AggregationBuilders.sum("amount").field("amount"))  //分组计算实付款汇总,需要加其他汇总的在这里依次加
                                            .subAggregation(PipelineAggregatorBuilders.bucketSelector("sales_bucket_filter",script,"quantity"))//查询是否大于指定值
                                    .order(BucketOrder.aggregation("amount", false))) //分组排序
    
                    .execute().actionGet();
    
    
            Terms terms = sr.getAggregations().get("by_product_code");   //查询遍历第一个根据货号分组的aggregation
    
            System.out.println(terms.getBuckets().size());
            for (Terms.Bucket entry : terms.getBuckets()) {
                Map<String,Object> objectMap = new HashMap<>();
                System.out.println("------------------");
                System.out.println("【 " + entry.getKey() + " 】订单数 : " + entry.getDocCount() );
    
                Sum sum0 = entry.getAggregations().get("quantity"); //取得销量的汇总
                Sum sum1 = entry.getAggregations().get("amount"); //取得销量的汇总
    
                objectMap.put("product_code", entry.getKey());
                objectMap.put("quantity",sum0.getValue());
                objectMap.put("amount",sum1.getValue());
                list.add(objectMap);
            }
    
            long endTime = System.currentTimeMillis();
            System.out.println("查询耗时" + ( endTime - beginTime ) + "毫秒");
    
            return list;
        }
    
    }

    ArticleQueryServiceImpl.java

    package org.jimmy.autosearch.util;
    
    import java.util.List;
    import java.util.Map;
    
    /**
     * 
     */
    public class EmptyUtils {
    
        public static boolean isEmpty(Object s) {
            if (s == null) {
                return true;
            }
            if ((s instanceof String) && (((String)s).trim().length() == 0)) {
                return true;
            }
            if (s instanceof Map) {
                return ((Map<?, ?>)s).isEmpty();
            }
            if (s instanceof List) {
                return ((List<?>)s).isEmpty();
            }
            if (s instanceof Object[]) {
                return (((Object[])s).length == 0);
            }
            return false;
        }
    
    }

    EmptyUtils.java

    package org.jimmy.autosearch.controller;
    
    import java.io.PrintWriter;
    import java.util.ArrayList;
    import java.util.HashMap;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletResponse;
    
    import org.jimmy.autosearch.pojo.Article;
    import org.jimmy.autosearch.pojo.EsEntity;
    import org.jimmy.autosearch.service.impl.ArticleQueryServiceImpl;
    import org.jimmy.autosearch.service.impl.ElasticSearchServiceImpl;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestBody;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    
    @Controller
    @RequestMapping("/article")
    @SuppressWarnings("unchecked")
    public class ArticleController {
    
        @Resource
        private ArticleQueryServiceImpl articleQueryService;
        @Resource
        private ElasticSearchServiceImpl elasticSearchService;
        
        @RequestMapping(value = "/index")
        public String index(){
            return "article";
        }
        
        @RequestMapping(value = "/add", method = RequestMethod.POST, produces = {"application/json; charset=utf-8"})
        public String addArticle(@RequestBody Article article){
            /*articleService.save(article);
            JSONObject jsonObject = new JSONObject();
            jsonObject.put("status", "success");
            String result = jsonObject.toJSONString();
            return result;*/
            return null;
        }
        
        @ResponseBody
        @RequestMapping(value = "/findByKey/{key}/{page}/{size}", method = RequestMethod.GET, produces = {"application/json; charset=utf-8"})
        public void findByKey(@PathVariable String key, @PathVariable int page, @PathVariable int size, HttpServletResponse response){
            try{
                EsEntity es = new EsEntity();
                es.setIndex("jimmy_article");
                es.setType("article");
                HashMap<String, String> params = null;
                if(key != null && key.trim().length() > 0){
                    params = new HashMap<String, String>();
                    params.put("message", key);
                }
                ArrayList<Article> articleList = articleQueryService.findByParams(es, params);
                HashMap<String, Object> resultMap = articleQueryService.paging(articleList, page, size);
                ArrayList<Article> list = (ArrayList<Article>) resultMap.get("list");
                Integer maxPageSize = (Integer) resultMap.get("maxPageSize");
                JSONArray jsonArray = new JSONArray();
                list.forEach(a -> jsonArray.add(a));
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("articleList", jsonArray);
                jsonObject.put("page", page);
                jsonObject.put("size", size);
                jsonObject.put("maxPageSize", maxPageSize);
                response.setContentType("text/json;charset=utf-8");
                PrintWriter out = response.getWriter();
                out.println(jsonObject);
                out.flush();
                out.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        
    }

    ArticleController.java

    效果图:

    修改后的ArticleQueryServiceImpl,201912301426

    package org.jimmy.autosearch.service.impl;
    
    import org.elasticsearch.action.search.SearchRequestBuilder;
    import org.elasticsearch.action.search.SearchResponse;
    import org.elasticsearch.client.transport.TransportClient;
    import org.elasticsearch.index.query.QueryBuilders;
    import org.elasticsearch.script.Script;
    import org.elasticsearch.script.ScriptType;
    import org.elasticsearch.search.SearchHits;
    import org.elasticsearch.search.aggregations.AggregationBuilders;
    import org.elasticsearch.search.aggregations.BucketOrder;
    import org.elasticsearch.search.aggregations.PipelineAggregatorBuilders;
    import org.elasticsearch.search.aggregations.bucket.terms.Terms;
    import org.elasticsearch.search.aggregations.metrics.Sum;
    import org.jimmy.autosearch.pojo.Article;
    import org.jimmy.autosearch.pojo.EsEntity;
    import org.jimmy.autosearch.service.QueryService;
    import org.springframework.stereotype.Service;
    
    import com.alibaba.fastjson.JSON;
    import com.alibaba.fastjson.JSONObject;
    
    import javax.annotation.Resource;
    import java.util.*;
    import java.util.Map.Entry;
    
    
    /**
     * Created by baishuai on 2018/12/18
     */
    @Service
    @SuppressWarnings("deprecation")
    public class ArticleQueryServiceImpl implements QueryService<Article> {
        
        @Resource
        TransportClient transportClient;//注入es操作对象
    
        @Override
        public ArrayList<Article> findByParams(EsEntity es, HashMap<String, String> params) {
            ArrayList<Article> articleList = new ArrayList<Article>();
            SearchRequestBuilder searchRequest = transportClient.prepareSearch(es.getIndex()).setTypes(es.getType()).setSize(10000);
            if(params != null){
                Set<Entry<String, String>> paramsEntry = params.entrySet();
                paramsEntry.forEach(param -> {
                    searchRequest.setQuery(QueryBuilders.boolQuery().must(QueryBuilders.termQuery(param.getKey() + ".keyword", param.getValue())));
                });
            }
            SearchResponse searchResponse = searchRequest.execute().actionGet();
            SearchHits hits = searchResponse.getHits();
            hits.forEach(h -> {
                if(h != null && h.getSourceAsString() != null
                    && h.getSourceAsString().trim().length() > 0){
                    String content = h.getSourceAsString();
                    JSONObject jsonObject = JSONObject.parseObject(content);
                    Article article = JSON.toJavaObject(jsonObject, Article.class);
                    articleList.add(article);
                }
            });
            return articleList;
        }
        
        public HashMap<String, Object> paging(ArrayList<Article> articleList, Integer page, Integer size){
            HashMap<String, Object> map = new HashMap<String, Object>();
            if(page == null){
                page = 0;
            }
            if(size == null){
                size = 10;
            }
            int count = articleList.size();
            int maxPageSize = 0;
            if(count > 0){
                maxPageSize = (count - 1) / size + 1;
            }
            ArrayList<Article> list = new ArrayList<Article>();
            int beginIndex = page * size;
            int endIndex = (page + 1) * size > count ? count : (page + 1) * size;
            for(int i = beginIndex; i < endIndex; i++){
                list.add(articleList.get(i));
            }
            map.put("list", list);
            map.put("page", page);
            map.put("size", size);
            map.put("maxPageSize", maxPageSize);
            return map;
        }
        
        @Override
        public List<Map<String, Object>> queryListFromES(EsEntity es, int storeId, String storeName, String startDate, String endDate) {
    
            List<Map<String, Object>> list = new ArrayList<>();
    
            Map<String,Object> map = Collections.emptyMap();
    
            Script script = new Script(ScriptType.INLINE, "painless","params._value0 > 0",map);  //提前定义好查询销量是否大于1000的脚本,类似SQL里面的having
    
            long beginTime = System.currentTimeMillis();
    
            SearchResponse sr = transportClient.prepareSearch(es.getIndex()).setTypes(es.getType()) //要查询的表
                    .setQuery(QueryBuilders.boolQuery()
                            .must(QueryBuilders.termQuery("store_id", storeId))  //挨个设置查询条件,没有就不加,如果是字符串类型的,要加keyword后缀
                            .must(QueryBuilders.termQuery("store_name.keyword", storeName))
                            .must(QueryBuilders.rangeQuery("pay_date.keyword").gte(startDate).lte(endDate))
                    ).addAggregation(
                            AggregationBuilders.terms("by_product_code").field("product_code.keyword").size(2000) //按货号分组,最多查500个货号.SKU直接改字段名字就可以
                                            .subAggregation(AggregationBuilders.sum("quantity").field("quantity"))  //分组计算销量汇总
                                            .subAggregation(AggregationBuilders.sum("amount").field("amount"))  //分组计算实付款汇总,需要加其他汇总的在这里依次加
                                            .subAggregation(PipelineAggregatorBuilders.bucketSelector("sales_bucket_filter",script,"quantity"))//查询是否大于指定值
                                    .order(BucketOrder.aggregation("amount", false))) //分组排序
    
                    .execute().actionGet();
    
    
            Terms terms = sr.getAggregations().get("by_product_code");   //查询遍历第一个根据货号分组的aggregation
    
            System.out.println(terms.getBuckets().size());
            for (Terms.Bucket entry : terms.getBuckets()) {
                Map<String,Object> objectMap = new HashMap<>();
                System.out.println("------------------");
                System.out.println("【 " + entry.getKey() + " 】订单数 : " + entry.getDocCount() );
    
                Sum sum0 = entry.getAggregations().get("quantity"); //取得销量的汇总
                Sum sum1 = entry.getAggregations().get("amount"); //取得销量的汇总
    
                objectMap.put("product_code", entry.getKey());
                objectMap.put("quantity",sum0.getValue());
                objectMap.put("amount",sum1.getValue());
                list.add(objectMap);
            }
    
            long endTime = System.currentTimeMillis();
            System.out.println("查询耗时" + ( endTime - beginTime ) + "毫秒");
    
            return list;
        }
    
    }

    修改后的ArticleController,201912301427

    package org.jimmy.autosearch.controller;
    
    import java.io.PrintWriter;
    import java.text.SimpleDateFormat;
    import java.util.ArrayList;
    import java.util.Date;
    import java.util.HashMap;
    import java.util.UUID;
    
    import javax.annotation.Resource;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    import org.jimmy.autosearch.pojo.Article;
    import org.jimmy.autosearch.pojo.EsEntity;
    import org.jimmy.autosearch.service.impl.ArticleQueryServiceImpl;
    import org.jimmy.autosearch.service.impl.ElasticSearchServiceImpl;
    import org.springframework.stereotype.Controller;
    import org.springframework.web.bind.annotation.PathVariable;
    import org.springframework.web.bind.annotation.RequestMapping;
    import org.springframework.web.bind.annotation.RequestMethod;
    import org.springframework.web.bind.annotation.ResponseBody;
    
    import com.alibaba.fastjson.JSONArray;
    import com.alibaba.fastjson.JSONObject;
    
    @Controller
    @RequestMapping("/article")
    @SuppressWarnings("unchecked")
    public class ArticleController {
    
        @Resource
        private ArticleQueryServiceImpl articleQueryService;
        @Resource
        private ElasticSearchServiceImpl elasticSearchService;
        private static final String INDEX = "jimmy_article";
        private static final String TYPE = "article";
        private static final SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        
        @RequestMapping(value = "/index/{key}/{page}/{size}")
        public String index(@PathVariable String key, @PathVariable String page, @PathVariable String size, HttpServletRequest request){
            request.setAttribute("key", key);
            request.setAttribute("page", page);
            request.setAttribute("size", size);
            return "article";
        }
        
        @RequestMapping(value = "/delete/{id}", method = RequestMethod.POST, produces = {"application/json; charset=utf-8"})
        public void deleteArticle(@PathVariable String id, HttpServletResponse response){
            JSONObject jsonObject = new JSONObject();
            String status = "failed";
            try{
                elasticSearchService.deleteById(INDEX, TYPE, id);
                status = "success";
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                jsonObject.put("status", status);
            }
            try{
                response.setContentType("text/json;charset=utf-8");
                PrintWriter out = response.getWriter();
                out.println(jsonObject);
                out.flush();
                out.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        
        @RequestMapping(value = "/addOrUpdate/{jsonStr}", method = RequestMethod.POST, produces = {"application/json; charset=utf-8"})
        public void addOrUpdateArticle(@PathVariable String jsonStr, HttpServletResponse response){
            JSONObject jsonObject = new JSONObject();
            String status = "failed";
            try{
                JSONObject jsonData = JSONObject.parseObject(jsonStr);
                String postDate = sdf.format(new Date());
                jsonData.put("postDate", postDate);
                String id = jsonData.getString("id");
                if(id == null || id.trim().length() == 0){
                    UUID uuid = UUID.randomUUID();
                    id = uuid.toString();
                    jsonData.put("id", id);
                    jsonStr = jsonData.toJSONString();
                    elasticSearchService.insertById(INDEX, TYPE, id, jsonStr);
                }else{
                    jsonStr = jsonData.toJSONString();
                    elasticSearchService.updateById(INDEX, TYPE, id, jsonStr);
                }
                status = "success";
            }catch(Exception e){
                e.printStackTrace();
            }finally{
                jsonObject.put("status", status);
            }
            try{
                response.setContentType("text/json;charset=utf-8");
                PrintWriter out = response.getWriter();
                out.println(jsonObject);
                out.flush();
                out.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        
        @RequestMapping(value = "/edit/{type}/{jsonStr}", method = RequestMethod.GET, produces = {"application/json; charset=utf-8"})
        public String add(@PathVariable String type, @PathVariable String jsonStr, HttpServletRequest request){
            if(type.equals("0")){
                //新增
            }else if(type.equals("1")){
                //修改
                if(jsonStr != null && jsonStr.trim().length() > 0){
                    JSONObject jsonData = JSONObject.parseObject(jsonStr);
                    String id = jsonData.getString("id");
                    request.setAttribute("id", id);
                    String user = jsonData.getString("user");
                    request.setAttribute("user", user);
                    String message = jsonData.getString("message");
                    request.setAttribute("message", message);
                }
            }
            return "articleEdit";
        }
        
        @ResponseBody
        @RequestMapping(value = "/findByKey/{key}/{page}/{size}", method = RequestMethod.GET, produces = {"application/json; charset=utf-8"})
        public void findByKey(@PathVariable String key, @PathVariable int page, @PathVariable int size, HttpServletResponse response){
            try{
                EsEntity es = new EsEntity();
                es.setIndex("jimmy_article");
                es.setType("article");
                HashMap<String, String> params = null;
                if(key != null && key.trim().length() > 0){
                    params = new HashMap<String, String>();
                    params.put("message", key);
                }
                ArrayList<Article> articleList = articleQueryService.findByParams(es, params);
                HashMap<String, Object> resultMap = articleQueryService.paging(articleList, page, size);
                ArrayList<Article> list = (ArrayList<Article>) resultMap.get("list");
                Integer maxPageSize = (Integer) resultMap.get("maxPageSize");
                JSONArray jsonArray = new JSONArray();
                list.forEach(a -> jsonArray.add(a));
                JSONObject jsonObject = new JSONObject();
                jsonObject.put("articleList", jsonArray);
                jsonObject.put("page", page);
                jsonObject.put("size", size);
                jsonObject.put("maxPageSize", maxPageSize);
                response.setContentType("text/json;charset=utf-8");
                PrintWriter out = response.getWriter();
                out.println(jsonObject);
                out.flush();
                out.close();
            }catch(Exception e){
                e.printStackTrace();
            }
        }
        
    }

    页面,201912301427

    <%@ page language="java" contentType="text/html; charset=utf-8"
        pageEncoding="utf-8"%>
    <!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">
    <html>
    <head>
    <meta http-equiv="Content-Type" content="text/html; charset=utf-8">
    <title>Insert title here</title>
        <script type="text/javascript" src="http://127.0.0.1:10001/js/jquery-1.12.4.js"></script>
        <style type="text/css">
        
            #articleListTable {
                border: 1px solid black;
                border-collapse: collapse;
            }
            
            #articleListTable tr td {
                border: 1px solid black;
            }
        
            #pageSetting {
                width: 100%; 
                text-align: center;
            }
            
            #pageSetting tr td {
                border: 0;
            }
        
        </style>
    </head>
    <body>
    
        <div id="articleList">
            <table id="articleListTable" >
                <tr>
                    <td>
                        id
                    </td>
                    <td>
                        user
                    </td>
                    <td>
                        message
                    </td>
                    <td>
                        postDate
                    </td>
                    <td>
                        operate
                    </td>
                </tr>
            </table>
        </div>
    
        <div id="articleTitleDiv" style="display: none;">
            <table id="articleTitle">
                <tr>
                    <td>
                        id
                    </td>
                    <td>
                        user
                    </td>
                    <td>
                        message
                    </td>
                    <td>
                        postDate
                    </td>
                    <td>
                        operate
                    </td>
                </tr>
            </table>
        </div>
    
        <script type="text/javascript">
            
            var key = '${requestScope.key}' == '' ? '%20' : '${requestScope.key}';
            var pageIndex = '${requestScope.page}';
            var pageSize = '${requestScope.size}';
            var maxPageSize = 0;
            var searchObj = {};
        
            $(function(){
                
                $.ajax({
                    url: '/article/findByKey/' + key + '/' + pageIndex + '/' + pageSize,
                    data: searchObj,
                    type: 'get',
                    dataType: 'json',
                    success: function (result) {
                        if(result){
                            var articleList = result.articleList;
                            if(articleList){
                                for(var i = 0; i < articleList.length; i++){
                                    var article = articleList[i];
                                    var html = '<tr>'
                                          + '<td>'
                                          + article.id
                                          + '</td>'
                                          + '<td>'
                                          + article.user
                                          + '</td>'
                                          + '<td>'
                                          + article.message
                                          + '</td>'
                                          + '<td>'
                                          + article.postDate
                                          + '</td>'
                                          + '<td>'
                                          + '<a href="javascript: void(0);" class="add">新增</a>&nbsp;'
                                          + '<a href="javascript: void(0);" class="update">修改</a>&nbsp;'
                                          + '<a href="javascript: void(0);" class="delete">删除</a>&nbsp;'
                                          + '</td>'
                                          + '</tr>';
                                    $("#articleListTable").append(html);
                                }
                                var pageParams = {};
                                pageParams.pageIndex = result.page;
                                pageParams.maxPageSize = result.maxPageSize;
                                maxPageSize = pageParams.maxPageSize;
                                loadPageSetting(pageParams);
                                addClick();
                                updateClick();
                                deleteClick();
                                firstPageClick();
                                previousPageClick();
                                nextPageClick();
                                lastPageClick();
                            }
                        }
                    }
                });
                
            });
            
            function lastPageClick(){
                $("#lastPage").on("click", function(){
                    var index = 0;
                    if(maxPageSize > 0){
                        index = maxPageSize - 1;
                    }
                    window.location = '/article/index/' + key + '/' + index + '/' + pageSize + '/';
                });
            }
            
            function nextPageClick(){
                $("#nextPage").on("click", function(){
                    var currentPage = $("#currentPage").text();
                    currentPage = parseInt(currentPage);
                    currentPage++;
                    if(currentPage > maxPageSize){
                        currentPage = maxPageSize;
                    }
                    var index = currentPage - 1;
                    window.location = '/article/index/' + key + '/' + index + '/' + pageSize + '/';
                });
            }
            
            function previousPageClick(){
                $("#previousPage").on("click", function(){
                    var currentPage = $("#currentPage").text();
                    currentPage = parseInt(currentPage);
                    currentPage--;
                    var index = 0;
                    if(currentPage < 0){
                        currentPage = 0;
                        index = currentPage;
                    }else{
                        index = currentPage - 1;
                    }
                    window.location = '/article/index/' + key + '/' + index + '/' + pageSize + '/';
                });
            }
            
            function firstPageClick(){
                $("#firstPage").on("click", function(){
                    window.location = '/article/index/' + key + '/' + 0 + '/' + pageSize + '/';    
                });
            }
            
            function deleteClick(){
                $(".delete").on("click", function(){
                    var flag = confirm("确认删除吗?");
                    if(flag){
                        var id = $(this).parent().parent().children("td:eq(0)").text();
                        $.ajax({
                            url: '/article/delete/' + id,
                            data: searchObj,
                            type: 'post',
                            dataType: 'json',
                            success: function (result) {
                                if(result){
                                    var status = result.status;
                                    if(status == 'success'){
                                        alert("删除成功!");
                                        location.reload();
                                    }else{
                                        alert("删除失败!");
                                    }
                                }
                            }
                        });
                    }
                });
            }
            
            function updateClick(){
                $(".update").on("click", function(){
                    var type = "1";
                    var id = $(this).parent().parent().children("td:eq(0)").text();
                    var user = $(this).parent().parent().children("td:eq(1)").text();
                    var message = $(this).parent().parent().children("td:eq(2)").text();
                    var jsonObject = {};
                    jsonObject.id = id;
                    jsonObject.user = user;
                    jsonObject.message = message;
                    var jsonStr = JSON.stringify(jsonObject);
                    window.location = '/article/edit/' + type + '/' + jsonStr;
                });
            }
            
            function addClick(){
                $(".add").on("click", function(){
                    var type = "0";
                    var jsonObject = {};
                    var jsonStr = JSON.stringify(jsonObject);
                    window.location = '/article/edit/' + type + '/' + jsonStr;
                });
            }
            
            function loadPageSetting(pageParams){
                var html = '<tr>'
                         + '<td colspan="5">'
                         + '<table id="pageSetting">'
                         + '<tr>'
                         + '<td>'
                         + '<a href="javascript: void(0);" id="firstPage">首页</a>'
                         + '&nbsp;'
                         + '<a href="javascript: void(0);" id="previousPage">上一页</a>'
                         + '&nbsp;'
                         + '<a href="javascript: void(0);" id="nextPage">下一页</a>'
                         + '&nbsp;'
                         + '<a href="javascript: void(0);" id="lastPage">尾页</a>'
                         + '&nbsp;'
                         + '当前第<span id="currentPage">' + (pageParams.pageIndex + 1) + '</span>页'
                         + '&nbsp;'
                         + '' + pageParams.maxPageSize + ''
                         + '</td>'
                         + '</tr>'
                         + '</table>'
                         + '</td>'
                         + '</tr>';
                $("#articleListTable").append(html);
            }
        
        </script>
    
    </body>
    </html>

    效果图:

     

    参考:

    https://github.com/whiney/springboot-elasticsearch

    里面具体逻辑实现我进行了修改,毕竟要符合实际.

  • 相关阅读:
    docker PXC MYSQL集群节点启动失败/节点顺序消失/只剩一个节点存在问题的解决
    springgateway
    rabbitMQ重复消费(结合死循环重发那一篇看)
    rabbitMq可靠性投递之手动ACK
    3表查询,1:多:多,根据1查多再查多
    tp后台注册登录配置项
    volist/foreach下,点击循环中的一个进行操作
    生成随机订单号
    省市县的下拉列表
    银行下拉列表
  • 原文地址:https://www.cnblogs.com/JimmySeraph/p/12096922.html
Copyright © 2011-2022 走看看