在web应用中使用solr(一)
来源:互联网 发布:网络日报 编辑:程序博客网 时间:2024/06/05 14:53
下面在实际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代码
@Servicepublic 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代码
@Controllerpublic 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"; }}
- 在web应用中使用solr(一)
- 在web应用中使用solr(二)
- Zend Studio使用教程之在Docker容器中调试PHP Web应用(一)
- 在WEB应用中使用MVC模式
- 在WEB应用中使用MVC模式
- 在web应用中使用日志
- Spring 在 WEB 应用中使用
- 在web应用中使用Spring
- 在web应用中使用Log4j 2
- 如何在web应用中使用Axis2
- Spring在web应用中使用?
- Spring_35_在 WEB 应用中使用 Spring
- 在WEB应用中使用spring
- 【Spring】在WEB应用中使用Spring
- solr在windows下的安装使用(一)
- Solr学习一:在tomcat中发布solr
- 在web项目中使用mongoDB(一)
- 在Eclipse中使用tomcat配置solr
- 每日一题(20)——malloc与free(一)
- 菜鸟心历之路(10)
- nrf52832 gpio9和10默认是NFC,非普通GPIO
- StreamTook(周考1)
- Xutils
- 在web应用中使用solr(一)
- 搭建自己的Linux根文件系统
- 重写Python脚本时关于建立框架的想法
- LightOJ 1070 Algebraic Problem
- 收费系统——SQLHelper类分析+重构
- 周考1(配置)
- linux 添加python 模块搜索路径(以thrift为例)
- 光纤分类——多模和单模
- java