solr简单搜索案例
使用Solr实现电商网站中商品信息搜索功能,可以根据关键字搜索商品信息,根据商品分类、价格过滤搜索结果,也可以根据价格进行排序,实现分页。
架构分为:
1、 solr服务器
2、 自己的web服务器(需要开发)
3、 数据库mysql
solr案例 本案例用的springmvc+solr+mysql
自己开发的应用
1、 Controller
获取搜索条件,并响应搜索结果到前台页面。
2、 Service
使用solrj来调用solr的服务进行索引和搜索
Service调用dao进行商品数据的维护时,要同步更新索引库(不实现)
3、 Dao(本案例不实现)
对商品数据进行维护和查询
功能:接收service层传递过来的参数,根据参数查询索引库,返回查询结果。
参数:SolrQuery对象
返回值:一个商品列表List
返回:ResultModel
方法定义:ResultModel queryProduct(SolrQuery query) throws Exception;
商品对象模型:
public class ProductModel {
// 商品编号
private String pid;
// 商品名称
private String name;
// 商品分类名称
private String catalog_name;
// 价格
private float price;
// 商品描述
private String description;
// 图片名称
private String picture;
}
返回值对象模型
public class ResultModel {
// 商品列表
private List
// 商品总数
private Long recordCount;
// 总页数
private int pageCount;
// 当前页
private int curPage;
}
Dao接口:
public ResultModel productSearch(SolrQuery solrQuery) throws Exception;
DaoImp:
@Repository
public class ProductDaoimp implements ProductDao {
@Autowired
private SolrServer solrServer;
@Override
public ResultModel productSearch(SolrQuery solrQuery) throws Exception {
// TODO Auto-generated method stub
ResultModel resultModel = new ResultModel();
QueryResponse query = solrServer.query(solrQuery);
SolrDocumentList results = query.getResults();
resultModel.setRecordCount(results.getNumFound());
List productList = new ArrayList<>();
for (SolrDocument doc : results) {
ProductModel productModel = new ProductModel();
String id = (String) doc.get("id");
Map>> highlighting = query.getHighlighting();
String productname = "";
if (highlighting != null && highlighting.size() > 0) {
List list2 = highlighting.get(doc.get("id")).get("product_name");
if (list2 != null) {
productname = list2.get(0);
} else {
productname = (String) doc.get("product_name");
}
}
productModel.setPid(id);
productModel.setName(productname);
productModel.setCatalog_name((String) doc.get("product_catalog_name"));
productModel.setPicture((String) doc.get("product_picture"));
productModel.setPrice(Float.parseFloat((String.valueOf(doc.get("product_price")))));
productList.add(productModel);
}
resultModel.setProductList(productList);
return resultModel;
}
}
Service层(接口及实现):
接口:
public interface ProductService {
ResultModel productSearch(String queryString,String catalog_name, String price, Integer page, String sort, Model model) throws Exception;
}
实现:
@Service
@Transactional
public class ProductServiceimp implements ProductService {
private final int PAZE_SIZE = 8;
@Autowired
private ProductDao productDao;
@Override
public ResultModel productSearch(String queryString, String catalog_name, String price, Integer page, String sort,
Model model) throws Exception {
// TODO Auto-generated method stub
// 拼装查询条件
SolrQuery query = new SolrQuery();
query.set("df", "product_keywords");
// 查询条件
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) * PAZE_SIZE;
//设置默认搜索域
query.setStart(page);
query.setRows(PAZE_SIZE);
// 高亮设置
query.setHighlight(true);
query.addHighlightField("product_name");
query.setHighlightSimplePre("");
query.setHighlightSimplePost("");
// 查询商品列表
ResultModel resultModel = productDao.productSearch(query);
// 计算总页数
long pages = ( resultModel.getRecordCount() / PAZE_SIZE);
if ( resultModel.getRecordCount() % PAZE_SIZE > 0) {
pages = pages + 1;
}
resultModel.setPageCount(pages);
resultModel.setCurPage(page);
return resultModel;
}
}
Controller层:
@Controller
public class ProductController {
@Autowired
private ProductService productservice;
@RequestMapping("/list")
public String productSearch(String queryString,String catalog_name, String price, Integer page, String sort, Model model) throws Exception {
ResultModel resultModel= productservice.productSearch(queryString,catalog_name, price, page, sort, model);
model.addAttribute("result", resultModel);
// 参数回显
model.addAttribute("queryString", queryString);
model.addAttribute("caltalog_name", catalog_name);
model.addAttribute("price", price);
model.addAttribute("sort", sort);
model.addAttribute("page", page);
return "product_list";
}
}
POJO类:
public class ProductModel {
// 商品编号
private String pid;
// 商品名称
private String name;
// 商品分类名称
private String catalog_name;
// 价格
private float price;
// 商品描述
private String description;
// 图片名称
private String picture;
public String getPid() {
return pid;
}
public void setPid(String pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getCatalog_name() {
return catalog_name;
}
public void setCatalog_name(String catalog_name) {
this.catalog_name = catalog_name;
}
public float getPrice() {
return price;
}
public void setPrice(float price) {
this.price = price;
}
public String getDescription() {
return description;
}
public void setDescription(String description) {
this.description = description;
}
public String getPicture() {
return picture;
}
public void setPicture(String picture) {
this.picture = picture;
}
}
ResultModel类:
public class ResultModel {
// 商品列表
private List productList;
// 商品总数
private Long recordCount;
// 总页数
private Long pageCount;
// 当前页
private long curPage;
public List getProductList() {
return productList;
}
public void setProductList(List productList) {
this.productList = productList;
}
public Long getRecordCount() {
return recordCount;
}
public void setRecordCount(Long recordCount) {
this.recordCount = recordCount;
}
public Long getPageCount() {
return pageCount;
}
public void setPageCount(Long pageCount) {
this.pageCount = pageCount;
}
public long getCurPage() {
return curPage;
}
public void setCurPage(long curPage) {
this.curPage = curPage;
}
}
config:
WEB.XML代码:
springmvcssm
index.html
index.htm
index.jsp
default.html
default.htm
default.jsp
CharacterEncodingFilter
org.springframework.web.filter.CharacterEncodingFilter
encoding
utf-8
CharacterEncodingFilter
/*
springmvc
org.springframework.web.servlet.DispatcherServlet
contextConfigLocation
classpath:springMvc.xml
springmvc
*.action
jsp:
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core"%>
<%@ taglib prefix="fmt" uri="http://java.sun.com/jsp/jstl/fmt" %>
T恤 - 商品筛选
另外需要js包
楼主不知道咋把图片上传上去,刚开始写帖子,希望看到这篇文章的人见谅哟