下面在实际web应用中使用solr
需求
使用solr实现电商网站中的商品信息搜索功能,可以根据关键字、分类、价格搜索商品信息,可以根据价格进行排序
业务流程
功能分析
1. Dao
功能:实现一个调用solr服务的功能,要求service层传递过来一个Solrquery对象,直接执行查询,得到返回结果。返回商品列表,以及查询结果的总数量。
参数:SolrQuery对象
返回结果:ResultModel
方法定义:ResultModel queryProduct(SolrQuery query) throws Exception;
1、商品实体类
public class ProductModel {
// 商品编号
private String pid;
// 商品名称
private String name;
// 商品分类名称
private String catalog_name;
// 价格
private float price;
// 商品描述
private String description;
// 图片名称
private String picture;
}
2.返回值对象模型
public class ResultModel {
// 商品列表
private List<ProductModel> productList;
// 商品总数
private Long recordCount;
// 总页数
private int pageCount;
// 当前页
private int curPage;
}
2.Service
功能
接收表现层传递过来的参数,根据查询查询参数拼装查询对象。调用dao查询商品列表。根据返回结果中的商品总数量计算总页数。
参数
1、查询条件:String queryString
2、过滤条件,商品分类名称:String catalog_name
3、价格区间的过滤条件,价格区间格式:0-10,11-20,21-30,30-*:String price
4、排序条件,根据价格排序,可以只传递排序方式0:升序 1:降序:String sort
5、分页条件,只需要得到页码即可,每页显示商品的数量定义常量:Integer page
返回值
ResultModel
接口方法定义
ResultModel queryProduct(String queryString, String catalog_name, String price, String sort, Integer page) throws Exception;
3.Controller
功能:接收页面传递过来的参数,调用service查询商品列表。把商品列表传递到页面。还需要查询条件的回显。
参数:
1、查询条件:String queryString
2、过滤条件,商品分类名称:String catalog_name
3、价格区间的过滤条件,价格区间格式:0-10,11-20,21-30,30-*:String price
4排序条件,根据价格排序,可以只传递排序方式0:升序 1:降序:String sort
5、分页条件,只需要得到页码即可,每页显示商品的数量定义常量:Integer page
6、Model,相当于request。
返回值:返回一个字符串,就是一个jsp的名称。
方法定义:
String queryProduct(String queryString, String catalog_name, String price, String sort, Integer page, Model model);
环境搭建
使用的索引库为 这篇文章中的索引库
创建一个maven工程
jar 包 看pom文件
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.bjsxt</groupId>
<artifactId>8_6_JdWithSolr</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>war</packaging>
<dependencies>
<!-- spring核心包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-core</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!--spring-webmvc包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!--spring-jdbc包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-jdbc</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!--spring-aspects包 -->
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-aspects</artifactId>
<version>4.3.7.RELEASE</version>
</dependency>
<!--servlet包注意范围:provided -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!--jsp注意范围 provided -->
<dependency>
<groupId>javax.servlet.jsp</groupId>
<artifactId>javax.servlet.jsp-api</artifactId>
<version>2.3.1</version>
<scope>provided</scope>
</dependency>
<!-- jstl jar包 -->
<dependency>
<groupId>jstl</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<!--jackson包 -->
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.8.8</version>
</dependency>
<dependency>
<groupId>org.apache.solr</groupId>
<artifactId>solr-solrj</artifactId>
<version>4.10.3</version>
</dependency>
</dependencies>
</project>
Dao 代码
public class ProductDaoImpl implements ProductDao {
@Autowired
private SolrServer solrServer;
@Override
public ResultModel queryProduct(SolrQuery query) throws Exception {
//执行查询
QueryResponse queryResponse = solrServer.query(query);
//取商品列表
SolrDocumentList solrDocumentList = queryResponse.getResults();
//商品列表
List<ProductModel> productList = new ArrayList<>();
//遍历商品列表
for (SolrDocument solrDocument : solrDocumentList) {
ProductModel productModel = new ProductModel();
productModel.setPid((String) solrDocument.get("id"));
//取高亮显示
Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");
String productName = "";
if (null != list && list.size() > 0) {
productName = list.get(0);
} else {
productName = (String) solrDocument.get("product_name");
}
productModel.setName(productName);
productModel.setCatalog_name((String) solrDocument.get("product_catalog_name"));
productModel.setPrice((float) solrDocument.get("product_price"));
productModel.setPicture((String) solrDocument.get("product_picture"));
//添加到商品列表
productList.add(productModel);
}
//返回值对象
ResultModel resultModel = new ResultModel();
resultModel.setProductList(productList);
resultModel.setRecordCount(solrDocumentList.getNumFound());
return resultModel;
}
Service代码
@Service
public class ProductServiceImpl implements ProductService {
@Autowired
private ProductDao productDao;
@Override
public ResultModel queryProduct(String queryString, String catalog_name,
String price, String sort, Integer page) throws Exception {
//拼装查询条件
SolrQuery query = new SolrQuery();
//查询条件
if (null != queryString && !"".equals(queryString)) {
query.setQuery(queryString);
} else {
query.setQuery("*:*");
}
//商品类别过滤
if (null != catalog_name && !"".equals(catalog_name)) {
query.addFilterQuery("product_catalog_name:" + catalog_name);
}
//价格过滤
if (null != price && !"".equals(price)) {
String[] strings = price.split("-");
query.addFilterQuery("product_price:["+strings[0]+" TO "+strings[1]+"]");
}
//排序条件
if ("1".equals(sort)) {
query.setSort("product_price", ORDER.desc);
} else {
query.setSort("product_price", ORDER.asc);
}
//分页处理
if (null == page) page = 1;
int start = (page - 1) * Global.PAGE_SIZE;
query.setStart(start);
query.setRows(Global.PAGE_SIZE);
//设置默认搜索域
query.set("df", "product_keywords");
//高亮设置
query.setHighlight(true);
query.addHighlightField("product_name");
query.setHighlightSimplePre("<span style=\"color:red\">");
query.setHighlightSimplePost("</span>");
//执行查询
ResultModel resultModel = productDao.queryProduct(query);
//计算总页数
Long recordCount = resultModel.getRecordCount();
int pages = (int) (recordCount / Global.PAGE_SIZE);
if (recordCount % Global.PAGE_SIZE > 0) {
pages++;
}
resultModel.setPageCount(pages);
resultModel.setCurPage(page);
return resultModel;
}
}
Controller代码
@Controller
public class ProductController {
@Autowired
private ProductService service;
@RequestMapping("/list")
public String queryProduct(String queryString, String catalog_name, String price,
String sort, Integer page, Model model) {
//执行查询
ResultModel resultModel = null;
try {
resultModel = service.queryProduct(queryString, catalog_name, price, sort, page);
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
//把查询结果传递到页面
model.addAttribute("result", resultModel);
//参数回显
model.addAttribute("queryString", queryString);
model.addAttribute("catalog_name", catalog_name);
model.addAttribute("price", price);
model.addAttribute("sort", sort);
model.addAttribute("page", page);
//返回jsp的名称
return "product_list";
}
}