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添加:
<bean id="cloudSolrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer"> <constructor-arg name="zkHost" value="${SOLRClOUD.SERVER.URL}"></constructor-arg> </bean>
我们都知道solr没有真正的修改,所谓的修改只是先删除后插入的操作(根据id来覆盖记录)
所以这里封装了三种操作:
所以这里封装了三种操作:
- 插入或修改(saveOrUpdate)
- 删除(deleteByIds)
- 查询(search)
import java.util.ArrayList; import java.util.Collection; 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.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.ISolrService; import com.quhappy.tools.base.StringUtil; import net.sf.json.JSONArray; import net.sf.json.JSONObject; @Transactional @Service public class SolrServiceImpl implements ISolrService{ @Autowired private SolrServer solrServer; private final String SUCCESS = "success"; private final String ERROR = "error"; /** * 查询记录 * @param coreName solr核名称 * @param q 查询条件 q = "productTitle:迪士尼*" * @param fq 过滤条件 fq = {"skuName:一日游*"} * @param sortField 排序条件 map.put("productId", true); true代表升序(asc),false代表降序(desc) * @param pageNum 需要展示的页数 * @param pageSize 每页的记录大小 * @return Map <br> * status:状态 success 或 error<br> * message:返回消息 <br> * totle:总记录数<br> * pageNum:当前页数<br> * data:json数组(JSONArray)字符串 */ public Map<String, Object> search(String coreName, String q, String[] fq, Map<String, Boolean> sortField, int pageNum, int pageSize){ Map<String, Object> map = new HashMap<String, Object>(); map.put("status", ERROR); try{ if(StringUtil.isAllNullOrEmpty(coreName)){ map.put("message", "coreName不能为空"); return map; } //设置默认的collection ((CloudSolrServer) solrServer).setDefaultCollection(coreName); //创建查询对象 SolrQuery query = new SolrQuery(); if(!StringUtil.isAllNullOrEmpty(q)){ //设置查询条件 query.setQuery(q); }else{ //默认查询所有 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); } } //设置分页 query.setStart((pageNum - 1) * pageSize); query.setRows(pageSize); //执行查询 //根据查询条件查询索引库 QueryResponse queryResponse = solrServer.query(query); //data:json数组 JSONArray ja = new JSONArray(); //取查询结果 SolrDocumentList solrDocumentList = queryResponse.getResults(); for (SolrDocument solrDocument : solrDocumentList) { JSONObject jo = new JSONObject(); Map<String, Object> fieldValueMap = solrDocument.getFieldValueMap(); for(String key : fieldValueMap.keySet()){ Object value = fieldValueMap.get(key); jo.put(key, value); } ja.add(jo); } map.put("data", ja.toString()); //计算查询结果总页数 long recordCount = solrDocumentList.getNumFound(); long pageCount = recordCount / pageSize; if (recordCount % pageSize > 0) { pageCount++; } map.put("status", SUCCESS); map.put("message", "查询成功"); map.put("totle", pageCount); map.put("pageNum", pageNum); }catch (Exception e) { e.printStackTrace(); map.put("message", "出现异常:"+e.getMessage()); } return map; } /** * 批量插入或更新记录 * @param jsonDocumentList 插入或更新的json字符串List。必须传<font style="color:red"><strong>id</strong></font> * <p>样例:</p> * <p>{"id":"123", "productId":123, "productTitle":"香港经典景点门票", "skuName":["挪亚方舟门票","张保仔维港晚间游"]}</p> * @param coreName solr的核名称 * @return Map <br> * status:状态 success 或 error<br> * message:返回状态消息 */ @SuppressWarnings("rawtypes") public Map<String, Object> saveOrUpdateBatch(List<String> jsonDocumentList, String coreName){ Map<String, Object> map = new HashMap<String, Object>(); try{ map.put("status", ERROR); if(StringUtil.isAllNullOrEmpty(coreName)){ map.put("message", "coreName不能为空"); return map; } //设置默认的collection ((CloudSolrServer) solrServer).setDefaultCollection(coreName); //创建一个文档对象 Collection<SolrInputDocument> documentList = new ArrayList<SolrInputDocument>(); for(String jsonDocument : jsonDocumentList){ JSONObject json = JSONObject.fromObject(jsonDocument.toString()); if(json.has("id") && !StringUtil.isAllNullOrEmpty(String.valueOf(json.get("id")))){ //创建一个文档对象 SolrInputDocument document = new SolrInputDocument(); // 遍历拿数据 Iterator it = json.keys(); while (it.hasNext()) { String key = (String)it.next(); Object value = json.get(key); if(!(value instanceof JSONArray)){ //向文档中添加域 document.addField(key, value); }else{//数组类型 JSONArray ja = JSONArray.fromObject(json.get(key)); for(Object o : ja){//遍历数组的值 //向文档中添加域 document.addField(key, o); } } } documentList.add(document); }else{ map.put("message", "id不能为空"); return map; } } //把文档添加到索引库 solrServer.add(documentList); //提交 solrServer.commit(); map.put("status", SUCCESS); map.put("message", "提交成功"); }catch (Exception e) { map.put("message", "出现异常:"+e.getMessage()); } return map; } /** * 插入或更新记录 * @param jsonDocument 插入或更新的json字符串。必须传<font style="color:red"><strong>id</strong></font> * <p>样例:</p> * <p>{"id":"123", "productId":123, "productTitle":"香港经典景点门票", "skuName":["挪亚方舟门票","张保仔维港晚间游"]}</p> * @param coreName solr的核名称 * @return Map <br> * status:状态 success 或 error<br> * message:返回状态消息 */ @SuppressWarnings("rawtypes") public Map<String, Object> saveOrUpdate(String jsonDocument, String coreName){ Map<String, Object> map = new HashMap<String, Object>(); try{ map.put("status", ERROR); if(StringUtil.isAllNullOrEmpty(coreName)){ map.put("message", "coreName不能为空"); return map; } //设置默认的collection ((CloudSolrServer) solrServer).setDefaultCollection(coreName); //创建一个文档对象 JSONObject json = JSONObject.fromObject(jsonDocument.toString()); if(json.has("id") && !StringUtil.isAllNullOrEmpty(String.valueOf(json.get("id")))){ //创建一个文档对象 SolrInputDocument document = new SolrInputDocument(); // 遍历拿数据 Iterator it = json.keys(); while (it.hasNext()) { String key = (String)it.next(); Object value = json.get(key); if(!(value instanceof JSONArray)){ //向文档中添加域 document.addField(key, value); }else{//数组类型 JSONArray ja = JSONArray.fromObject(json.get(key)); for(Object o : ja){//遍历数组的值 //向文档中添加域 document.addField(key, o); } } } //把文档添加到索引库 solrServer.add(document); //提交 solrServer.commit(); }else{ map.put("message", "id不能为空"); return map; } map.put("status", SUCCESS); map.put("message", "提交成功"); }catch (Exception e) { map.put("message", "出现异常:"+e.getMessage()); } return map; } /** * 删除记录根据id * @param coreName solr的核名称 * @param ids 需要删除记录的id * <p>样例:</p> * <p>deleteByIds("collection1", "123")</p> * 或者 * <p>String[] ids = {"123", "456"}; deleteByIds("collection1", ids)</p> * @return Map <br> * status:状态 success 或 error<br> * message:返回状态消息 */ public Map<String, Object> deleteByIds(String coreName, String... ids){ Map<String, Object> map = new HashMap<String, Object>(); try{ map.put("status", ERROR); if(StringUtil.isAllNullOrEmpty(coreName)){ map.put("message", "coreName不能为空"); return map; } //设置默认的collection ((CloudSolrServer) solrServer).setDefaultCollection(coreName); for(String id : ids){ if(StringUtil.isAllNullOrEmpty(id)){ map.put("message", "id不能为空"); return map; } solrServer.deleteById(id); //提交 solrServer.commit(); } map.put("status", SUCCESS); map.put("message", "删除成功"); }catch (Exception e) { map.put("message", "出现异常:"+e.getMessage()); } return map; } }
下面是调用者示例,调用上面的通用方法
/** * solr批量插入或更新记录 */ @RequestMapping(value="/saveOrUpdateBatch") public @ResponseBody void saveOrUpdateBatch(HttpServletRequest req) { try { List<String> list = new ArrayList<String>(); //第一条json记录 JSONObject jo = new JSONObject(); jo.put("id", "123"); jo.put("productId", 123); jo.put("productTitle", "迪士尼"); JSONArray ja = new JSONArray(); ja.put("一日游"); ja.put("两日游"); jo.put("skuName", ja); list.add(jo.toString()); //第二条json记录 JSONObject jo1 = new JSONObject(); jo1.put("id", "456"); jo1.put("productId", 456); jo1.put("productTitle", "新加坡动物园"); JSONArray ja1 = new JSONArray(); ja1.put("动物园一日游"); ja1.put("动物园两日游"); jo1.put("skuName", ja1); list.add(jo1.toString()); Map<String, Object> map = solrService.saveOrUpdateBatch(list, "collection1"); System.out.println(map.toString()); } catch (Exception ex) { System.out.println(ex.getMessage()); } } /** * solr插入或更新记录 */ @RequestMapping(value="/saveOrUpdate") public @ResponseBody void saveOrUpdate(HttpServletRequest req) { try { //第一条json记录 JSONObject jo = new JSONObject(); jo.put("id", "1234"); jo.put("productId", 1234); jo.put("productTitle", "迪士尼1"); JSONArray ja = new JSONArray(); ja.put("一日游1"); ja.put("两日游1"); jo.put("skuName", ja); Map<String, Object> map = solrService.saveOrUpdate(jo.toString(), "collection1"); System.out.println(map.toString()); } catch (Exception ex) { System.out.println(ex.getMessage()); } } /** * solr删除记录 */ @RequestMapping(value="/deleteByIds") public @ResponseBody void deleteByIds(HttpServletRequest req) { try { String[] ids = {"123", "456"}; Map<String, Object> map = solrService.deleteByIds("collection1", ids); System.out.println(map.toString()); } catch (Exception ex) { System.out.println(ex.getMessage()); } } /** * solr查询记录 */ @RequestMapping(value="/search") public @ResponseBody void search(HttpServletRequest req) { try { String[] arr = {"skuName:一日游*"}; Map<String, Boolean> sortField = new HashMap<String, Boolean>(); sortField.put("productId", true); Map<String, Object> map = solrService.search("collection1", "productTitle:迪士尼*", arr, null, 1, 10); System.out.println(map.toString()); } catch (Exception ex) { System.out.println(ex.getMessage()); } }solrJ之增删改查的封装就讲到这里!