• solrJ的使用--覆盖创建索引,查询,删除索引【转自http://blog.sina.com.cn/s/blog_64ac3ab10100t3mq.html】


    package com.xzhe.common.search;
    
    import java.util.ArrayList;
    import java.util.Collection;
    import java.util.List;
    import java.util.Map;
    
    import org.apache.solr.client.solrj.SolrQuery;
    import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;
    import org.apache.solr.client.solrj.response.FacetField;
    import org.apache.solr.client.solrj.response.FacetField.Count;
    import org.apache.solr.client.solrj.response.QueryResponse;
    import org.apache.solr.common.SolrDocumentList;
    import org.apache.solr.common.SolrInputDocument;
    
    import com.xzhe.goods.bo.Goods;
    import com.xzhe.goods.dao.impl.GoodsDAO;
    
    public class SolrSearch {
        private static String tomcat_solr = "http://localhost:8983/solr";
        private static CommonsHttpSolrServer solr = null;
        private static GoodsDAO goodsDAO = GoodsDAO.getInstance();
        private static List<Goods> goodList = new ArrayList<Goods>();
    
        // 初始化solr服务
        public static void initiate() {
            try {
                solr = new CommonsHttpSolrServer(tomcat_solr);
                solr.setConnectionTimeout(100);
                solr.setDefaultMaxConnectionsPerHost(100);
                solr.setMaxTotalConnections(100);
            } catch (Exception e) {
                System.out.println("请检查tomcat服务器或端口是否开启!");
                e.printStackTrace();
            }
        }
    
        // 检测good是否有字段为空
        public static Boolean CheckGood(Goods good) {
            if (null == good.getTitle() || good.getTitle().length() == 0) {
                return false;
            } else if (null == good.getGoodsId()) {
                return false;
            } else if (null == good.getStartTime()) {
                return false;
            } else if (null == good.getDiscount()) {
                return false;
            } else if (null == good.getCurPrice()) {
                return false;
            } else if (null == good.getSiteId()) {
                return false;
            } else if (null == good.getBuyNum()) {
                return false;
            } else {
                return true;
            }
        }
    
        // 将数据库中的时间转换为solr可接受的格式
        public static String Convertime(String time) {
            time = time.replace(" ", "T");
            time = time + "00Z";
            return time;
        }
    
        // 添加list到索引,flag为false,在原有基础上添加,为false,重新添加、原有索引不会被删除
        public static void addGoods(List<Goods> list, Boolean flag) {
            if (flag) {
                try {
                    solr.deleteByQuery("*:*");
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
    
            Collection<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();
    
            for (int i = 0; i < list.size(); i++) {
                Goods good = list.get(i);
                if (CheckGood(good)) {
                    SolrInputDocument doc = new SolrInputDocument();
                    doc.addField("goodid", good.getGoodsId());
                    doc.addField("title", good.getTitle());
                    doc.addField("siteid", good.getSiteId());
                    doc.addField("buynum", good.getBuyNum());
                    doc.addField("starttime", Convertime(good.getStartTime()
                            .toString()));
                    doc.addField("discount", good.getDiscount());
                    doc.addField("curprice", good.getCurPrice());
                    docs.add(doc);
                }
            }
    
            try {
                solr.add(docs);
                solr.optimize();
                solr.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        // 转换good到beans
        public static GoodsBeans ConvertGoodstoBeans(Goods good) {
            if (!CheckGood(good)) {
                return null;
            }
            GoodsBeans beans = new GoodsBeans(good.getGoodsId().toString(),
                    good.getTitle(), good.getSiteId().toString(), good.getBuyNum(),
                    good.getStartTime(), good.getDiscount(), good.getCurPrice());
            return beans;
        }
    
        // 添加beans到索引
        public static void addGoodsBeans(List<GoodsBeans> beansList) {
            try {
                solr.addBeans(beansList);
            } catch (Exception e) {
                e.printStackTrace();
            } finally {
                try {
                    solr.optimize();
                    solr.commit();
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        }
    
        // 删除所有索引
        public static void DeleteAllIndex() {
            try {
                solr.deleteByQuery("*:*");
                solr.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        // 根据ID删除索引
        public static void DeleteIndex(List<String> ids) {
            try {
                solr.deleteById(ids);
                solr.commit();
            } catch (Exception e) {
                e.printStackTrace();
            }
        }
    
        // 进行搜索,field、key为查询(值或范围均可),start为起始查询位置,row为返回结果个数,sortfield为排序字段,flag中true升序、false降序,hightlight选择是否高亮返回,高亮字段为title
        public static QueryResponse Search(String[] field, String[] key, int start,
                int count, String[] sortfield, Boolean[] flag, Boolean hightlight) {
            if (null == field || null == key || field.length != key.length) {
                return null;
            }
            if (null == sortfield || null == flag
                    || sortfield.length != flag.length) {
                return null;
            }
    
            SolrQuery query = null;
            try {
                if (field[0].equals("title")) {
                    // query = new SolrQuery("*" + key + "*");
                    query = new SolrQuery(field[0] + ":" + key[0]);
                } else {
                    query = new SolrQuery(field[0] + ":" + key[0]);
                }
                for (int i = 0; i < field.length; i++) {
                    if (field[i].equals("title")) {
                        // query = new SolrQuery("*" + key + "*");
                        query.addFilterQuery(field[i] + ":" + key[i]);
                    } else {
                        query.addFilterQuery(field[i] + ":" + key[i]);
                    }
                }
                query.setStart(start);
                query.setRows(count);
                for (int i = 0; i < sortfield.length; i++) {
                    if (flag[i]) {
                        query.addSortField(sortfield[i], SolrQuery.ORDER.asc);
                    } else {
                        query.addSortField(sortfield[i], SolrQuery.ORDER.desc);
                    }
                }
                if (null != hightlight) {
                    query.setHighlight(true); // 开启高亮组件
                    query.addHighlightField("title");// 高亮字段
                    query.setHighlightSimplePre("<font color="red">");// 标记
                    query.setHighlightSimplePost("</font>");
                    query.setHighlightSnippets(1);
                    query.setHighlightFragsize(1000);
                }
            } catch (Exception e) {
                e.printStackTrace();
            }
            System.out.println(query.toString());
    
            QueryResponse rsp = null;
            try {
                rsp = solr.query(query);
            } catch (Exception e) {
                e.printStackTrace();
                return null;
            }
            return rsp;
        }
    
        // 自动补全
        public static String[] autoComplete(String prefix, int min) {
            String words[] = null;
            StringBuffer sb = new StringBuffer("");
            SolrQuery query = new SolrQuery("*.*");
            QueryResponse rsp = new QueryResponse();
            try {
                query.setFacet(true);
                query.setQuery("*:*");
                query.setFacetPrefix(prefix);
                query.addFacetField("title");
                rsp = solr.query(query);
            } catch (Exception e) {
                // TODO: handle exception
                e.printStackTrace();
                return null;
            }
    
            if (null != rsp) {
                FacetField ff = rsp.getFacetField("title");
                List<Count> countList = ff.getValues();
                if (null == countList) {
                    return null;
                }
                for (int i = 0; i < countList.size(); i++) {
                    String tmp[] = countList.get(i).toString().split(" ");
                    if (tmp[0].length() < 2) {
                        continue;
                    }
                    sb.append(tmp[0] + " ");
                    min--;
                    if (min == 0) {
                        break;
                    }
                }
                words = sb.toString().split(" ");
            } else {
                return null;
            }
            return words;
        }
    
        public static void main(String[] args) {
            initiate();
    
            // 建立索引
    //         goodList = goodsDAO.findAll();
    //         System.out.println("所有商品载入完成!");
    //         DeleteAllIndex();
    //         System.out.println("原有索引已清除!");
    //         System.out.println("添加索引开始!");
    //         long starttime = System.currentTimeMillis();
    //         addGoods(goodList, true);
    //         long endtime = System.currentTimeMillis();
    //         System.out.println("共耗时" + (endtime - starttime) + "ms!");
    //         System.out.println("添加索引完成!");
    
            // 进行查询
            SolrDocumentList solrList = null;
            QueryResponse rsp = null;
    
            // rsp = Search("title", "*变形金* 蓝精灵", 0, 10, "buynum", false, true);
    //        String field[] = { "title", "buynum", "discount", "starttime" };
    //        String key[] = { "变形金刚 哈利波特", "[90 TO 100]", "[2.0 TO 3.0]",
    //                "[2011-07-18T00:00:00.000Z TO 2011-07-19T00:00:00.000Z]" };
            String field[] = {"title"};
            String key[] = {"牛奶"};
            String sortfield[] = { "buynum" };
            Boolean flag[] = { false };
            long starttime = System.currentTimeMillis();
            rsp = Search(field, key, 0, 10, sortfield, flag, true);
            long endtime = System.currentTimeMillis();
            System.out.println("共耗时" + (endtime - starttime) + "ms!");
    
            if (null != rsp) {
                solrList = rsp.getResults();
                for (int i = 0; i < solrList.size(); i++) {
                    System.out.println(solrList.get(i).toString());
                }
                // 高亮显示部分
                System.out.println("搜索结果共" + solrList.size() + "条!");
                System.out.println("");
                Map<String, Map<String, List<String>>> hightlight = rsp
                        .getHighlighting();
                List<GoodsBeans> tmpLists = rsp.getBeans(GoodsBeans.class);
                for (int i = 0; i < tmpLists.size(); i++) {
                    String hlString = hightlight.get(tmpLists.get(i).getGoodId())
                            .get("title").toString();
                    if (null != hlString) {
    //                    System.out.println(hlString);
                    }
                }
            }
    
            // 自动补全
            // String words[] = autoComplete("哈利", 10);
            // if (null != words) {
            // System.out.println(words.length);
            // for (int i = 0; i < words.length; i++) {
            // System.out.println(words[i]);
            // }
            // }
        }
    
    }
  • 相关阅读:
    阿里云ECS服务器安装docker
    ActiveMq-常见的问题
    ActiveMq-基础知识
    java语言概述
    【日语词汇类编】自然与人:气候与环境
    【日语词汇类编】传媒与娱乐:大众传播媒介
    机器学习数学基础-线性代数
    掌握机器学习数学基础之概率统计
    机器学习理论篇:机器学习的数学基础
    计算机基础知识
  • 原文地址:https://www.cnblogs.com/Lxiaojiang/p/6772917.html
Copyright © 2020-2023  润新知