Solr实现京东搜索

使用solr实现京东网站中的商品搜索功能,

需求:

1.可以根据关键字搜索商品信息

2.可以根据商品分类、价格过滤搜索结果

3.可以根据价格排序

4.可以实现分页

源码及solrHome下载地址:csdn站内下载

界面如下:

Solr实现京东搜索_第1张图片


Controller层:获取搜索条件,响应搜索结果到前台页面

service层:使用solrj调用solr的服务进行索引和搜索

dao层:不开发(数据参考solr笔记(二))

 1.配置商品图片的虚拟目录 images

Solr实现京东搜索_第2张图片

我们先来分析一下product_list.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" %>

















请求参数:

String queryString,String catalog_name,Stringprice,Integer page,String sort

请求返回值:

String(product_list) //返回到product_list.jsp页面

request域需要存储的数据(页面所需数据)

queryString、catalog_name、price、sort、resultcurPagepageCountrecordCountproductList


业务层:

根据查询条件,调用solrj的api方法,搜索索引库

封装result对象


创建pojo

页面需要什么就传递什么,根据分析简历商品的pojo,pid name price picture

public class Product {
	private String pid;
	private String name;
	private String price;
	private String picture;
get/set。。。
}



创建分页结果pojo

public class Result {
	private Integer curPage;// 当前页
	private Integer pageCount;// 总页数
	private Long recordCount;// 数据总条数
	private List productList;// 商品结果集
get/set。。。	
}

service

public interface SearchService {
	/**
	 * 根据条件从索引库中查询数据
	 * 
	 * @param queryString 查询关键词
	 * @param catalog_name 商品分类
	 * @param price 商品价格
	 * @param sort  排序
	 * @param page  当前页码
	 * @return
	 */
	Result search(String queryString, String catalog_name, String price, String sort, Integer page);

}

@Service	
public class SearchServiceImpl implements SearchService {

	@Autowired
	private HttpSolrServer httpSolrServer;

	@Override
	public Result search(String queryString, String catalog_name, String price, String sort, Integer page) {
		// 创建SolrQuery对象
		SolrQuery solrQuery = new SolrQuery();

		// 设置查询关键词
		if (StringUtils.isNotBlank(queryString)) {
			solrQuery.setQuery(queryString);
		} else {
			solrQuery.setQuery("*:*");
		}
		// 设置默认域
		solrQuery.set("df", "product_keywords");

		// 设置商品类名过滤条件
		// 设置商品分类名称
		if (StringUtils.isNotBlank(catalog_name)) {
			catalog_name = "product_catalog_name:" + catalog_name;
		}

		// 设置商品价格
		if (StringUtils.isNotBlank(price)) {
			String[] sp = price.split("-");
			if (sp != null && sp.length == 2) {
				price = "product_price:[" + sp[0] + " TO " + sp[1] + "]";
			}
		}
		solrQuery.setFilterQueries(catalog_name, price);

		// 商品排序,如果是1,正序排序,如果是其他,则倒序排序
		if ("1".equals(sort)) {
			solrQuery.setSort("product_price", ORDER.asc);
		} else {
			solrQuery.setSort("product_price", ORDER.desc);
		}

		// 设置分页
		if (page == null) {
			page = 1;
		}
		solrQuery.setStart((page - 1) * 20);
		solrQuery.setRows(20);

		// 设置高亮
		solrQuery.setHighlight(true);
		solrQuery.addHighlightField("product_name");
		solrQuery.setHighlightSimplePre("");
		solrQuery.setHighlightSimplePost("");

		// 查询数据
		QueryResponse response;
		try {
			response = httpSolrServer.query(solrQuery);
			// 获取查询总数
			SolrDocumentList results = response.getResults();
			long total = results.getNumFound();

			// 获取高亮数据
			Map>> map = response.getHighlighting();

			// 解析结果集,存放到Product中
			List products = new ArrayList<>();
			for (SolrDocument solrDocument : results) {
				Product product = new Product();
				// 商品id
				product.setPid(solrDocument.get("id").toString());
				// 商品标题,设置高亮
				List list = map.get(solrDocument.get("id")).get("product_name");
				if (list != null && list.size() > 0) {
					product.setName(list.get(0));
				} else {
					product.setName(solrDocument.get("product_name").toString());
				}
				// 商品价格
				product.setPrice(solrDocument.get("product_price").toString());
				// 商品图片
				product.setPicture(solrDocument.get("product_picture").toString());

				products.add(product);
			}

			// 封装返回对象
			Result result = new Result();

			result.setCurPage(page);
			result.setRecordCount(total);
			result.setProductList(products);
			// 总页数计算公式(total+rows-1)/rows
			result.setPageCount((int) (total + 20 - 1) / 20);

			return result;
		} catch (SolrServerException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}


		return null;

	}


 
  

controller

@Controller
@RequestMapping("/product")
public class ProductController {
	@Autowired
	private SearchService searchService;
	@RequestMapping("list")
	public String queryProduct(Model model, String queryString, String catalog_name, String price, String sort,
			Integer page) {
		// 根据条件搜索


		Result result = this.searchService.search(queryString, catalog_name, price, sort, page);

		// 把结果集放到模型中
		model.addAttribute("result", result);

		// 搜索条件数据回显
		model.addAttribute("queryString", queryString);
		model.addAttribute("catalog_name", catalog_name);
		model.addAttribute("price", price);
		model.addAttribute("sort", sort);
		model.addAttribute("page", page);

		return "product_list";
	}

}

 
  
 
 

你可能感兴趣的:(Solr)