Solr(八)solrJ之增删改查的封装

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来覆盖记录)
所以这里封装了三种操作:
  1. 插入或修改(saveOrUpdate)
  2. 删除(deleteByIds)
  3. 查询(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之增删改查的封装就讲到这里!

猜你喜欢

转载自blog.csdn.net/b_evan/article/details/80061103