solrJ是什么?
solrJ是操作solr的java客户端
Solrj(集群)和spring集成
resource.properties
#集群版
SOLRClOUD.SERVER.URL =192.168.168.128:2181,192.168.168.128:2182,192.168.168.128:2183
在applicationContext-solr.xml添加:
我们都知道solr没有真正的修改,所谓的修改只是先删除后插入的操作(根据id来覆盖记录)
所以这里封装了三种操作:
- 插入或修改(saveOrUpdate)
- 删除(deleteByIds)
- 查询(search)
import java.util.ArrayList;
import java.util.Collection;
import java.util.Date;
import java.util.HashMap;
import java.util.Iterator;
import java.util.List;
import java.util.Map;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
import org.apache.solr.client.solrj.impl.CloudSolrServer;
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.SolrDocument;
import org.apache.solr.common.SolrDocumentList;
import org.apache.solr.common.SolrInputDocument;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Transactional;
import com.quhappy.basesolr.facade.ISolrFacade;
import com.quhappy.tools.base.DateUtil;
import com.quhappy.tools.base.StringUtil;
import net.sf.json.JSONArray;
import net.sf.json.JSONObject;
@Transactional
@Service
public class SolrFacadeImpl implements ISolrFacade{
@Autowired
private SolrServer solrServer;
private final String SUCCESS = "success";
private final String ERROR = "error";
/**
* 查询记录(多条件查询)
* @param coreName solr核名称
* @param fq 过滤条件,切记不能用and和or来连接,要用&&和||连接
* fq = "(skuName:一日游* || productName:*迪士尼*) && productId:[5 TO 12]";
* @param sortField 排序条件 map.put("productId", true); true代表升序(asc),false代表降序(desc)
* @param returnFileds 返回的字段 returnFileds = {"productId","productName"};
* @param pageNum 需要展示的页数
* @param pageSize 每页的记录大小
* @param isFacet 是否开启facet分组查询
* @param FacetField 需要分组的字段名称
* @return Map
* status:状态 success 或 error
* message:返回消息
* totle:总记录数
* pageNum:当前页数
* facetCounts: 分组字段的总记录数 Map key:FacetField(分组的字段名称) value:分组后的总记录数
* data:json数组(JSONArray)字符串
*/
public Map searchManyCondition(String coreName, String fq, Map sortField,
String[] returnFileds, int pageNum, int pageSize, boolean isFacet, String[] FacetField){
Map map = new HashMap();
map.put("status", ERROR);
try{
if(StringUtil.isAllNullOrEmpty(coreName)){
map.put("message", "coreName不能为空");
return map;
}
//设置默认的collection
((CloudSolrServer) solrServer).setDefaultCollection(coreName);
//创建查询对象
SolrQuery query = new SolrQuery();
//默认查询所有
query.setQuery("*:*");
if(!StringUtil.isAllNullOrEmpty(fq)){
//设置过滤条件
query.addFilterQuery(fq);
}
if(sortField != null && sortField.size() > 0){
//设置排序
//遍历map的key和value
for(String key : sortField.keySet()){
Boolean value = sortField.get(key);
query.setSort(key, value?SolrQuery.ORDER.asc:SolrQuery.ORDER.desc);
}
}
//设置返回的字段
if(returnFileds != null){
query.setFields(returnFileds);
}
//设置分页
query.setStart((pageNum - 1) * pageSize);
query.setRows(pageSize);
//设置facet
if(isFacet){
query.setFacet(true);//设置facet=on
query.addFacetField(FacetField);//设置需要facet的字段
query.setFacetLimit(-1);//限制facet返回的数量 。-1表示不限制
query.setFacetMinCount(1);//设置返回的数据中每个分组的数据最小值,比如设置为1,则统计数量最小为1,不然不显示
}
//执行查询
//根据查询条件查询索引库
QueryResponse queryResponse = solrServer.query(query);
if(isFacet){
Map facetMap = new HashMap();
//执行查询
List facets = queryResponse.getFacetFields();// 返回的facet列表
for (FacetField facet :facets) {
List counts = facet.getValues();
facetMap.put(facet.getName(), counts.size());
}
map.put("facetCounts", facetMap);
}
//data:json数组
JSONArray ja = new JSONArray();
//取查询结果
SolrDocumentList solrDocumentList = queryResponse.getResults();
for (SolrDocument solrDocument : solrDocumentList) {
JSONObject jo = new JSONObject();
Map> fieldValueMap = solrDocument.getFieldValuesMap();
for(String key : fieldValueMap.keySet()){
Collection