转载请注明出处:http://blog.csdn.net/l1028386804/article/details/50456063

不多说了,直接上代码:

package com.cpf.service;  
  
import java.io.IOException;  
import java.net.MalformedURLException;  
import java.util.ArrayList;  
import java.util.Iterator;  
import java.util.List;  
import java.util.Map;  
  
import javax.faces.FactoryFinder;  
  
import org.apache.lucene.document.Document;  
import org.apache.solr.client.solrj.SolrQuery;  
import org.apache.solr.client.solrj.SolrServer;  
import org.apache.solr.client.solrj.SolrServerException;  
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;  
import org.apache.solr.client.solrj.response.FacetField;  
import org.apache.solr.client.solrj.response.QueryResponse;  
import org.apache.solr.common.SolrDocument;  
import org.apache.solr.common.SolrDocumentList;  
import org.apache.solr.common.SolrInputDocument;  
  
import com.cpf.model.Good;  
  
  
public class SolrService {  
     private static SolrServer solrServer;  
     public  SolrService(String solrUrl){  
         try {  
            solrServer= new CommonsHttpSolrServer(solrUrl);  
        } catch (MalformedURLException e) {  
            e.printStackTrace();  
        }  
     }  
       
     public void createIndexs(List<Good> list){  
         List<SolrInputDocument> docs = new ArrayList<SolrInputDocument>();  
         for(Good good :list){  
             SolrInputDocument doc= new SolrInputDocument();   
             doc.addField("id", good.getGood_id());  
             doc.addField("merchant_id", good.getGood_id());  
             doc.addField("region_id", good.getRegion_id());  
             doc.addField("good_name", good.getGood_name());  
             doc.addField("good_no", good.getGood_no());  
             doc.addField("barcode", good.getBarcode());  
             doc.addField("good_desc", good.getGood_desc());  
             doc.addField("price", good.getPrice());  
             doc.addField("num", good.getNum());  
             doc.addField("typeId", good.getTypeId());  
             doc.addField("typeName", good.getTypeName());  
             docs.add(doc);  
         }  
         try {  
            solrServer.add(docs);  
            solrServer.optimize();  
            solrServer.commit();  
        } catch (Exception e) {  
          
            e.printStackTrace();  
        }   
           
     }  
     public List<Good> search(String key){  
         List<Good> goodList= new ArrayList<Good>();  
         SolrQuery query= new SolrQuery();  
         query.setQuery("good_desc:"+key);  
         query.setRows(20);  
         query.setHighlight(true);  
            // 设置高亮区域  
         query.addHighlightField("good_desc");  
            // 设置高亮区域前缀  
         query.setHighlightSimplePre("<font color=\"red\">");  
            // 设置高亮区域后缀  
         query.setHighlightSimplePost("</font>");  
        // query.setFacet(true);  
         QueryResponse rsp = null;  
            try {  
                rsp = solrServer.query(query);  
              
            } catch (SolrServerException e) {  
                e.printStackTrace();  
            }  
            SolrDocumentList documentList=rsp.getResults();  
            @SuppressWarnings("unused")  
            Map<String, Map<String,List<String>>> map=rsp.getHighlighting();  
              
            Iterator<SolrDocument> list=documentList.iterator();  
              
            while(list.hasNext()){  
                SolrDocument doucment=list.next();  
                Good good= new Good();  
                String goodId=String.valueOf(doucment.get("id"));  
                String goodName=(String) doucment.get("good_name");  
                String goodDesc=(String) doucment.get("good_desc");  
                if(map.get(goodId)!=null && map.get(goodId).size()>0){  
                    if(map.get(goodId).get("good_desc")!=null){  
                        goodDesc=map.get(goodId).get("good_desc").get(0);  
                    }  
                }  
                good.setGood_id(Integer.parseInt(goodId));  
                good.setGood_name(goodName);  
                good.setGood_desc(goodDesc);  
                goodList.add(good);  
            }  
              
         return goodList;  
     }  
     public void delIndex(){  
         try {  
            solrServer.deleteByQuery("*:*");  
            solrServer.commit();//要记得提交数据  
        } catch (Exception e) {  
            e.printStackTrace();  
        }   
     }  
    public static SolrServer getSolrServer() {  
        return solrServer;  
    }  
    public static void setSolrServer(SolrServer solrServer) {  
        SolrService.solrServer = solrServer;  
    }  
       
}  
import java.lang.reflect.Field;  
import java.lang.reflect.Method;  
import java.net.MalformedURLException;  
import java.util.ArrayList;  
import java.util.List;  
import java.util.Map;  
import java.util.TreeMap;  
  
import org.apache.solr.client.solrj.SolrQuery;  
import org.apache.solr.client.solrj.impl.CommonsHttpSolrServer;  
import org.apache.solr.client.solrj.response.QueryResponse;  
import org.apache.solr.common.SolrDocumentList;  
  
public class SolrHttpServer {  
    //private Logger logger = LoggerFactory.getLogger(this.getClass());  
    private final static String URL = "http://localhost:8080/solr";  
    private final static Integer SOCKE_TTIMEOUT = 1000; // socket read timeout  
    private final static Integer CONN_TIMEOUT = 100;  
    private final static Integer MAXCONN_DEFAULT = 100;  
    private final static Integer MAXCONN_TOTAL = 100;  
    private final static Integer MAXRETRIES = 1;  
    private static CommonsHttpSolrServer server = null;  
    private final static String ASC = "asc";  
      
    public void init() throws MalformedURLException {  
            server = new CommonsHttpSolrServer( URL );  
            //server.setParser(new XMLResponseParser());  
            server.setSoTimeout(SOCKE_TTIMEOUT);  
            server.setConnectionTimeout(CONN_TIMEOUT);  
            server.setDefaultMaxConnectionsPerHost(MAXCONN_DEFAULT);  
            server.setMaxTotalConnections(MAXCONN_TOTAL);  
            server.setFollowRedirects(false);  
            server.setAllowCompression(true);  
            server.setMaxRetries(MAXRETRIES);  
    }  
      
    public static SolrDocumentList query(Map<String, String> property, Map<String, String> compositor, Integer pageSize) throws Exception {  
        SolrQuery query = new SolrQuery();  
        // 设置搜索字段  
        if(null == property) {  
            throw new Exception("搜索字段不可为空!");  
        } else {  
            for(Object obj : property.keySet()) {  
                StringBuffer sb = new StringBuffer();  
                sb.append(obj.toString()).append(":");  
                sb.append(property.get(obj));  
                String sql = (sb.toString()).replace("AND", " AND ").replace("OR", " OR ").replace("NOT", " NOT ");  
                query.setQuery(sql);  
            }  
        }  
        // 设置结果排序  
        if(null != compositor) {  
            for(Object obj : compositor.keySet()) {  
                if(ASC == compositor.get(obj) || ASC.equals(compositor.get(obj))) {  
                    query.addSortField(obj.toString(), SolrQuery.ORDER.asc);  
                } else {  
                    query.addSortField(obj.toString(), SolrQuery.ORDER.desc);  
                }  
            }  
        }  
        if(null != pageSize && 0 < pageSize) {  
            query.setRows(pageSize);  
        }  
        QueryResponse qr = server.query(query);  
        SolrDocumentList docList = qr.getResults();  
        return docList;  
    }  
      
    public static Map<String, String> getQueryProperty(Object obj) throws Exception {  
        Map<String, String> result = new TreeMap<String, String>();  
        // 获取实体类的所有属性,返回Fields数组  
        Field[] fields = obj.getClass().getDeclaredFields();  
        for(Field f : fields) {  
            String name = f.getName();// 获取属性的名字  
            String type = f.getGenericType().toString();  
            if("class java.lang.String".equals(type)) {// 如果type是类类型,则前面包含"class ",后面跟类名  
                Method me = obj.getClass().getMethod("get" + UpperCaseField(name));  
                String tem = (String) me.invoke(obj);  
                if(null != tem) {  
                    result.put(name, tem);  
                }  
            }  
        }  
        return result;  
    }  
      
    public static List<Object> querySolrResult(Object propertyObj, Object compositorObj, Integer pageSize) throws Exception {  
        Map<String, String> propertyMap = new TreeMap<String, String>();  
        Map<String, String> compositorMap = new TreeMap<String, String>();  
        propertyMap = getQueryProperty(propertyObj);  
        compositorMap = getQueryProperty(compositorObj);  
        SolrDocumentList docList = query(propertyMap, compositorMap, pageSize);  
        List<Object> list = new ArrayList<Object>();  
        for(Object obj : docList) {  
            list.add(obj);  
        }  
        return list;  
    }  
      
    private static String UpperCaseField(String name) {  
        return name.replaceFirst(name.substring(0, 1), name.substring(0, 1).toUpperCase());  
    }  
  
    public CommonsHttpSolrServer getServer() {  
        return server;  
    }  
  
    public void setServer(CommonsHttpSolrServer server) {  
        this.server = server;  
    }  
  
}