package solr.search;
import java.net.MalformedURLException;
import java.util.ArrayList;
import java.util.List;
import java.util.Map;
import javax.annotation.PostConstruct;
import org.apache.commons.logging.Log;
import org.apache.commons.logging.LogFactory;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.impl.LBHttpSolrServer;
import org.apache.solr.client.solrj.response.FacetField.Count;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Service;
/**
* @author xiaozhi
* @version 2010-7-20 下午02:57:04
* @param <T>
*/
/**
* 采用负载均衡方式
*/
//@Service
public class LBSolrQueryImpl<T> {
private static Log logger = LogFactory.getLog(LBSolrQueryImpl.class);
@Value(value = "#{globalProperties['solr.soTimeOut']}")
private int soTimeOut;
@Value(value = "#{globalProperties['solr.connectionTimeOut']}")
private int connectionTimeOut;
@Autowired
private LBHttpSolrServer lbhserver;
private final static String ASC = "asc";
/**
* 分页检索
* @param propertyMap 查询字段
* @param compositorMap 排序字段
* @param highlightArray 高亮字段
* @param classz
* @param startIndex 开始记录下标
* @param pageSize 每页条数
* @param isFacet 是否返回相关查询检索词列表
* @return
* @throws Exception
*/
public SolrResult<T> query(Map<String, String> propertyMap,Map<String, String> compositorMap,
String[] highlightArray,Class<T> classz,Integer startIndex, Integer pageSize,boolean isFacet)
throws Exception {
SolrQuery query = new SolrQuery();
// 设置搜索字段
if (null == propertyMap) {
throw new Exception("搜索字段不可为空!");
} else {
for (Object o : propertyMap.keySet()) {
StringBuffer sb = new StringBuffer();
sb.append(o.toString()).append(":");
sb.append(propertyMap.get(o));
String queryString = addBlank2Expression(sb.toString());
query.setQuery(queryString);
}
}
//设置是否获得查询分组列表(即相关检索)
if(isFacet){
query.setIncludeScore(true);//是否按每组数量高低排序
query.setFacet(true);//是否分组查询
//query.setRows(0);//设置返回结果条数,如果你时分组查询,你就设置为0
query.addFacetField("text");//增加分组字段
query.setFacetLimit(10);//限制每次返回结果数
query.setFacetMinCount(1);//限制最少返回1条才能入组
}
//设置高亮
if (null != highlightArray && !"*".equals(propertyMap.get("text"))) {
query.setHighlight(true);
for (String field : highlightArray) {
query.addHighlightField(field);
}
}
// 设置排序条件
if (null != compositorMap) {
for (Object co : compositorMap.keySet()) {
if (ASC == compositorMap.get(co)|| ASC.equals(compositorMap.get(co))) {
query.addSortField(co.toString(), SolrQuery.ORDER.asc);
} else {
query.addSortField(co.toString(), SolrQuery.ORDER.desc);
}
}
}
if (null != startIndex) {
query.setStart(startIndex);
}
if (null != pageSize && 0L != pageSize.longValue()) {
query.setRows(pageSize);
}
try {
QueryResponse qrsp = lbhserver.query(query);
long hits = qrsp.getResults().getNumFound();//获取结果总数
if(hits<=0)return null;
List<T> docs = qrsp.getBeans(classz);
List<Count> counts= new ArrayList<Count>();
if(isFacet){
counts= qrsp.getFacetField("text").getValues();
}
int qtime = qrsp.getQTime();
if (null != highlightArray) {//返回高亮字段
return new SolrResult<T>(qtime, counts, docs,qrsp.getHighlighting(),hits);
}else{
return new SolrResult<T>(qtime, counts, docs,null,hits);
}
} catch (Exception e) {
throw new Exception(e);
}
}
private String addBlank2Expression(String oldExpression) {
String lastExpression;
lastExpression = oldExpression.replace(" ", " OR ").replace("+", " AND ").replace("-"," NOT ");
return lastExpression;
}
@PostConstruct
public void init() throws MalformedURLException {
lbhserver.setSoTimeout(soTimeOut);
lbhserver.setConnectionTimeout(connectionTimeOut);
}
}