需要依赖solrj的jar包。
<!-- 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库
请求url:http://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集群的搭建。
此文章为原创,转载需说明原出处,谢谢。