Solr(二)使用solrJ对solr进行导入、查询、删除操作

需要依赖solrjjar包。

<!-- solr客户端 -->
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
</dependency>

使用solrJ操作solr

public class SolrJTest {
 
@Test
public void addDocument() throws Exception{
//创建连接
SolrServer solrServer = new HttpSolrServer("http://192.168.168.128:8080/solr");
//创建一个文档对象
SolrInputDocument document = new SolrInputDocument();
 
document.addField("id", 2);
document.addField("productId", 2);
document.addField("productTitle", "测试商品2");
document.addField("productValidStart", "2018-01-01");
document.addField("productValidEnd", "2018-05-05");
document.addField("merchantName", "去哪儿");
document.addField("productType", "一日游");
document.addField("countryName", "新加坡");
document.addField("merchantId", "23");
//把文档对象写入索引库
solrServer.add(document);
//提交
solrServer.commit();
}
@Test
public void deleteDocument() throws Exception {
//创建连接
SolrServer solrServer = new HttpSolrServer("http://192.168.168.128:8080/solr");
//solrServer.deleteById("2");
solrServer.deleteByQuery("*:*");
solrServer.commit();
}
}

这里会把操作solrJ的重点代码列出来。

不讲解创建maven工程,因为不是本章的重点。

把商品信息导入到索引库

思路:使用java程序读取mysql数据库中的商品信息,然后创建solr文档对象,把商品信息写入索引库。

solr集成spring

创建applicationContext-solr.xml文件和resource.properties

applicationContext-solr.xml:

<?xml version="1.0" encoding="UTF-8"?>

<beans xmlns="http://www.springframework.org/schema/beans"    

xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"   

xmlns:p="http://www.springframework.org/schema/p"  

xmlns:aop="http://www.springframework.org/schema/aop"   

xmlns:context="http://www.springframework.org/schema/context"  

xmlns:jee="http://www.springframework.org/schema/jee"

xmlns:mvc="http://www.springframework.org/schema/mvc"  

xmlns:tx="http://www.springframework.org/schema/tx"  

xsi:schemaLocation="    

http://www.springframework.org/schema/aop http://www.springframework.org/schema/aop/spring-aop-4.2.xsd  

http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.2.xsd  

http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.2.xsd  

http://www.springframework.org/schema/jee http://www.springframework.org/schema/jee/spring-jee-4.2.xsd

http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc.xsd

http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-4.2.xsd ">

<!-- 配置SolrServer对象 -->

<!-- 单机版 -->

<bean id="httpSolrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">

<constructor-arg name="baseURL" value="${SOLR.SERVER.URL}"></constructor-arg>

</bean> 

<!-- 集群版

<bean id="cloudSolrServer" class="org.apache.solr.client.solrj.impl.CloudSolrServer">

<constructor-arg name="zkHost" value="${SOLRClOUD.SERVER.URL}"></constructor-arg>

<property name="defaultCollection" value="collection2"></property>

</bean>-->

</beans>

resource.properties

#单机版
SOLR.SERVER.URL = http\://192.168.168.128:8080/solr

导入solr索引库的代码:

Controller

@Controller
@RequestMapping("/product")
public class ProductInfoController {

	@Autowired
	private IProductInfoService iProductInfoService;
	
	/**
	 * 导入商品到solr索引库中
	 */
	@RequestMapping(value="/importAllProduct", method=RequestMethod.POST)
	public @ResponseBody Object importAll() {
		try {
			iProductInfoService.importAllProduct();
			return new ResponseObject(true, "导入成功");
		} catch (Exception e) {
			e.printStackTrace();
			return new ResponseObject(false, CommonUtils.SYS_ERROR_MESSAGE);
		}
	}
}

Service:

从数据库中查询出所有的商品数据。创建一个SolrInputDocument对象,把对象写入索引库。

@Service
public class ProductInfoServiceImpl implements IProductInfoService{
	
	@Autowired
	private IProductInfoDao iProductInfoDao;

	@Autowired
	private SolrServer solrServer;

	/**
	 * 导入商品到solr索引库中
	 */
	public void importAllProduct() throws Exception{
		Map<String, Object> map = new HashMap<String, Object>();
		//查询商品列表
		List<Map<String, Object>> productList = iProductInfoDao.queryProductInfoGDSList(map);
		//把商品信息写入索引库
		for (Map<String, Object> info : productList) {
			//创建一个SolrInputDocument对象
			SolrInputDocument document = new SolrInputDocument();
			document.setField("id", (Integer)info.get("id"));
                 document.setField("productId", (Integer)info.get("id"));
			document.setField("productTitle", (String)info.get("productTitle"));
			document.setField("productValidStart", info.get("productValidStart")==null?"":(DateUtil.dateToString((Date)info.get("productValidStart"))));
			document.setField("productValidEnd", info.get("productValidEnd")==null?"":(DateUtil.dateToString((Date)info.get("productValidEnd"))));
			document.setField("merchantName", (String)info.get("merchantName"));
			document.setField("productType", CommonUtils.caseProductType((String)info.get("productType")));
			document.setField("countryName", (String)info.get("countryName"));
			document.setField("merchantId", (Integer)info.get("merchantId"));
			//写入索引库
			solrServer.add(document);
		}
		//提交修改
		solrServer.commit();
	}
}

dao层这里就不写出来了,相信大家都有各自的实现方式,我用的是mybatis。

导入商品到solr

请求urlhttp://192.168.200.4/quhappy-search/product/importAllProduct

所有的商品已经添加到solr索引库



solr常用查询参数:

q:查询关键词。支持 AND,OR ,*,?。支持多字段查询,模糊匹配。

fq:filter query,过虑查询。

sort:排序规则。默认按score排序。

start, rows:分页参数。start:开始的位置,rows:返回条数(page size)。

fl: 用来指定文档结果中应返回的 Field 集。默认为 “*”,指所有的字段。用逗号分隔的列表。

df:默认的查询字段。

Raw Query Parameters:原始查询参数。

wt:writer type,指定输出格式,可以有 xml, json, php, python,csv,ruby。

indent:返回的结果是否缩进,默认关闭,用 indent=true|on 开启,一般调试json,php,python,ruby输出- 才有必要用这个参数。


通过访问API的形式进行检索

封装SearchProductView类,作为输出的对象:

public class SearchProductView extends BaseView {

	private static final long serialVersionUID = 1L;
	
	//商品列表
	private List<ProductInfoGDSView> productList;
	//总记录数
	private long recordCount;
	//总页数
	private long pageCount;
	//当前页
	private long curPage;
。。。。。。省略getter、setter方法
}

封装SolrModel 类,作为输入的对象:

public class SolrModel extends BaseModel{

	private static final long serialVersionUID = 1L;
	
	//查询条件
	private String q;
	
	//过滤条件
	private String fq;
	
	//排序
	private String sort;
	
	//页数
	private Integer pageNum = 1;
	
	//每页显示多少条
	private Integer pageSize = 60;

。。。。。省略getter、setter方法
}

Controller

@Controller
public class SearchController {

	@Autowired
	private ISearchService searchService;
	
	/**
	 * 查询商品信息
	 */
	@RequestMapping(value="/searchProduct", method=RequestMethod.POST)
	public @ResponseBody Object searchProduct(@RequestBody SolrModel solrModel){
		try {
			SearchProductView searchProductView = searchService.searchProduct(solrModel);
			return new ResponseObject("searchProductView", searchProductView);
		} catch (Exception e) {
			e.printStackTrace();
			return new ResponseObject(false, CommonUtils.SYS_ERROR_MESSAGE);
		}
	}
}

Service

@Service
public class SearchServiceImpl implements ISearchService{

	@Autowired
	private SolrServer solrServer;
	
	/**
	 * 查询商品信息
	 */
	@Override
	public SearchProductView searchProduct(SolrModel solrModel) throws Exception {
		//创建查询对象
		SolrQuery query = new SolrQuery();
		//设置查询条件
		query.setQuery(solrModel.getQ());
		
		if(solrModel.getFq() != null && !solrModel.getFq().equals("")){
			//设置过滤条件
			query.set("fq", solrModel.getFq());
		}
		
		if(solrModel.getSort() != null && !solrModel.getSort().equals("")){
			//设置排序
			query.set("sort", solrModel.getSort());
		}
		
		//设置分页
		query.setStart((solrModel.getPageNum() - 1) * solrModel.getPageSize());
		query.setRows(solrModel.getPageSize());
		//设置默认搜素域
		//query.set("df", "product_keywords");
		//设置高亮显示
		query.setHighlight(true);
		query.addHighlightField("productTitle");
		query.setHighlightSimplePre("<em style=\"color:red\">");
		query.setHighlightSimplePost("</em>");
		//执行查询
		SearchProductView searchResult = search(query);
		//计算查询结果总页数
		long recordCount = searchResult.getRecordCount();
		long pageCount = recordCount / solrModel.getPageSize();
		if (recordCount % solrModel.getPageSize() > 0) {
			pageCount++;
		}
		searchResult.setPageCount(pageCount);
		searchResult.setCurPage(solrModel.getPageNum());
		
		return searchResult;
	}
	
	/**
	 * 从solr索引库中查询商品信息
	 * @param query
	 * @return
	 * @throws Exception
	 */
	@Override
	public SearchProductView search(SolrQuery query) throws Exception {
		//返回值对象
		SearchProductView result = new SearchProductView();
		//根据查询条件查询索引库
		QueryResponse queryResponse = solrServer.query(query);
		//取查询结果
		SolrDocumentList solrDocumentList = queryResponse.getResults();
		//取查询结果总数量
		result.setRecordCount(solrDocumentList.getNumFound());
		//商品列表
		List<ProductInfoGDSView> productList = new ArrayList<ProductInfoGDSView>();
		//取高亮显示
		Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
		//取商品列表
		for (SolrDocument solrDocument : solrDocumentList) {
			//创建一商品对象
			ProductInfoGDSView product = new ProductInfoGDSView();
			product.setProductId(Integer.parseInt((String) solrDocument.get("id")));
			//取高亮显示的结果
			List<String> list = highlighting.get(solrDocument.get("id")).get("productTitle");
			String productTitle = "";
			if (list != null && list.size()>0) {
				productTitle = list.get(0);
			} else {
				productTitle = (String) solrDocument.get("productTitle");
			}
			product.setProductTitle(productTitle);
			product.setProductValidStart((String) solrDocument.get("productValidStart"));
			product.setProductValidEnd((String) solrDocument.get("productValidEnd"));
			product.setProductTypeName((String) solrDocument.get("productType"));
			product.setCountryName((String) solrDocument.get("countryName"));
			//添加的商品列表
			productList.add(product);
		}
		result.setProductList(productList);
		return result;
	}
}

访问api

http://192.168.200.4/quhappy-search/searchProduct

Json参数:

{

"q":"productTitle:*香港*",

"fq":"productId:[1 TO 10]",

"sort":"productId desc"

}


使用solrJ对进行solr导入、查询、删除就讲到这里。

后续会更新solr集群的搭建。

此文章为原创,转载需说明原出处,谢谢。


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值