solr搜索引擎的使用(3)--java客户端调用

package cn.emag.solr.client;

import java.lang.reflect.Field;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import org.apache.log4j.Logger;
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.SortClause;
import org.apache.solr.client.solrj.impl.HttpSolrServer;
import org.apache.solr.client.solrj.response.QueryResponse;
import org.apache.solr.common.SolrDocumentList;

import cn.emag.cached.utils.ConfigCache;
import cn.emag.utils.CheckNull;
import cn.emag.utils.LogName;

/**
 * @Title: solr客户端工具类
 * @Description:
 * @Copyright: Copyright (c) Aug 27, 2013
 * @Company: **** 
 * @Author: shen
 * @Version: 1.0
 * @history:
 */
public class SolrClient
{
	private static SolrClient		client		= null;

	private static HttpSolrServer	solrServer	= null;

	/**
	 * log4j对象
	 */
	private static Logger			logger		= Logger.getLogger(LogName.SYS_LOG);

	public static synchronized SolrClient getInstance()
	{
		if (client == null)
		{
			client = new SolrClient();
		}

		return client;
	}

	public SolrClient()
	{
		// 从缓存中读取solr服务器地址
		String url = ConfigCache.getSolrServerUrl();

		solrServer = new HttpSolrServer(url);

		solrServer.setSoTimeout(3000); // socket read timeout

		solrServer.setConnectionTimeout(1000);

		solrServer.setDefaultMaxConnectionsPerHost(1000);

		solrServer.setMaxTotalConnections(10);

		solrServer.setFollowRedirects(false); // defaults to false

		solrServer.setAllowCompression(true);

		solrServer.setMaxRetries(1);
	}

	/**
	 * 添加索引数据
	 * 
	 * @param bean
	 *            实体bean(需要注解)
	 */
	public void saveOrUpdate(Object bean)
	{
		try
		{

			solrServer.addBean(bean);

			solrServer.commit();

		}
		catch (Exception e)
		{
			logger.error("添加更新索引数据,出错:", e);
		}
	}

	/**
	 * 添加索引数据
	 * 
	 * @param list
	 *            实体bean集合(需要注解)
	 */
	public void saveOrUpdate(List<?> list)
	{
		try
		{
			for (Object o : list)
			{
				solrServer.addBean(o);
			}

			solrServer.commit();

		}
		catch (Exception e)
		{
			logger.error("添加更新索引数据,出错:", e);
		}
	}

	public void deleteByQuery(String queryStr)
	{
		try
		{
			solrServer.deleteByQuery(queryStr);

			solrServer.commit();

		}
		catch (Exception e)
		{
			logger.error("根据查询条件,删除索引数据,出错:", e);
		}
	}

	/**
	 * 根据查询条件返回结果集合
	 * 
	 * @param queryStr
	 * @param fieldList
	 * @param descList
	 * @param bean
	 * @return
	 */
	public List<?> queryList(String queryStr, List<String> fieldList, List<String> descList, Class<?> bean)
	{
		List<?> list = null;

		try
		{
			SolrQuery query = new SolrQuery();

			// 查询的条件
			query.setQuery(queryStr);

			// 返回的属性(列),不设置则返回所有
			if (fieldList != null && !fieldList.isEmpty())
			{
				for (String filed : fieldList)
				{
					query.add(filed);
				}
			}

			// 设置排序项,升序还是降序
			if (descList != null && !descList.isEmpty())
			{
				for (String desc : descList)
				{
					query.addSort(new SortClause(desc, SolrQuery.ORDER.desc));

				}
			}

			// start row 相当于mysql中的limit
			query.setStart(0);

			query.setRows(10);

			QueryResponse qrsp = solrServer.query(query);

			list = qrsp.getBeans(bean);

		}
		catch (Exception e)
		{
			logger.error("根据条件查询索引数据,出错:", e);
		}

		return list;

	}

	/**
	 * @param queryStr
	 *            solr查询语句
	 * @param fieldList
	 *            展示的字段集合
	 * @param descList
	 *            倒序的字段集合
	 * @param ascList
	 *            正序的字段集合
	 * @param bean
	 *            实体
	 * @param hlStr
	 *            高亮的字段
	 * @param idStr
	 *            实体的id
	 * @param hlField
	 *            高亮的结果存放的字段
	 * @param pageNum
	 *            页码
	 * 
	 * @param pageSize
	 *            每页显示的记录数
	 * @return
	 */
	public Map<String, Object> queryListHightLight(String queryStr, List<String> fieldList, List<String> descList, List<String> ascList, Class<?> bean, String hlStr, String idStr, String hlField, int pageNum, int pageSize)
	{

		// 返回查询结果map
		Map<String, Object> resultMap = new HashMap<String, Object>();

		List<?> list = null;

		try
		{
			SolrQuery query = new SolrQuery();

			// 设置高亮
			query.setHighlight(true);

			query.setHighlightSimplePre("<span class='highlight'>");// 设置开头

			query.setHighlightSimplePost("</span>"); // 设置结尾

			// 设置高亮的哪些区域
			query.setParam("hl.fl", hlStr);

			// 查询的条件
			query.setQuery(queryStr);

			// 返回的属性(列),不设置则返回所有
			if (!CheckNull.isNull(fieldList))
			{
				for (String filed : fieldList)
				{
					query.add(filed);
				}
			}

			// 设置排序项,降序
			if (!CheckNull.isNull(descList))
			{
				for (String desc : descList)
				{
					query.addSort(new SortClause(desc, SolrQuery.ORDER.desc));

				}
			}

			// 设置排序项,升序
			if (!CheckNull.isNull(ascList))
			{
				for (String asc : ascList)
				{
					query.addSort(new SortClause(asc, SolrQuery.ORDER.asc));

				}
			}

			// start row 相当于mysql中的limit
			
			query.setStart((pageNum - 1) * pageSize);

			query.setRows(pageSize);

			QueryResponse qrsp = solrServer.query(query);

			SolrDocumentList documentList = qrsp.getResults();

			// 符合条件的记录数
			int count = (int) documentList.getNumFound();

			// 页数
			int pageCount = count / pageSize + (count % pageSize > 0 ? 1 : 0);

			resultMap.put("count", count);

			resultMap.put("pageCount", pageCount);

			list = qrsp.getBeans(bean);

			// 处理高亮字段以及对应接收的属性值
			String[] hlStrs = hlStr.split(",");

			String[] hlFields = hlField.split(",");

			Object temp = null;

			String[] setMethod = new String[hlFields.length];

			for (int i = 0; i < hlStrs.length; i++)
			{
				setMethod[i] = "set" + hlFields[i].toString().substring(0, 1).toUpperCase() + hlFields[i].toString().substring(1);
			}

			for (int i = 0; i < list.size(); i++)
			{
				temp = list.get(i);

				// 通过反射获取id的值
				Field fildId = temp.getClass().getDeclaredField(idStr);

				fildId.setAccessible(true);

				Object id = (Object) fildId.get(temp);

				// 将存在高亮值的字段的值设置到对应的属性值中
				if (null != qrsp.getHighlighting().get(id))
				{
					for (int j = 0; j < hlStrs.length; j++)
					{
						Object glConent = qrsp.getHighlighting().get(id).get(hlStrs[j]);

						if (null != glConent)
						{
							bean.getMethod(setMethod[j], String.class).invoke(temp, glConent.toString().substring(1, glConent.toString().length() - 1));
						}
					}

				}

			}

		}
		catch (Exception e)
		{
			logger.error("根据条件查询索引数据(高亮),出错:", e);
		}

		resultMap.put("list", list);

		return resultMap;
	}
}

 

1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。1、资源项目源码均已通过严格测试验证,保证能够正常运行; 2、项目问题、技术讨论,可以给博主私信或留言,博主看到后会第一时间与您进行沟通; 3、本项目比较适合计算机领域相关的毕业设计课题、课程作业等使用,尤其对于人工智能、计算机科学与技术等相关专业,更为适合; 4、下载使用后,可先查看README.md文件(如有),本项目仅用作交流学习参考,请切勿用于商业用途。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值