需要依赖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集群的搭建。
此文章为原创,转载需说明原出处,谢谢。