您的位置:首页 > 其它

全文搜索服务器Solr实例demo

2011-09-14 21:32 417 查看
http://cpf1985.iteye.com/blog/1074238

http://cpf1985.iteye.com/blog/1074265

其中solr服务类:

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;
	}

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: