solr简单搜索案例

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 productList;

 

// 商品总数

 

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" %>
















 另外需要js包

  楼主不知道咋把图片上传上去,刚开始写帖子,希望看到这篇文章的人见谅哟

  

 

 

 

 

转载于:https://www.cnblogs.com/sjzxs/p/9536491.html

你可能感兴趣的:(solr简单搜索案例)