1.  综合案例

1.1. 需求

使用Solr实现电商网站中商品信息搜索功能,可以根据关键字、分类、价格搜索商品信息,也可以根据价格进行排序,并且实现分页功能。

界面如下:

1.2分析

开发人员需要的文档:静态页面(根据UI设计由美工给出)、数据库设计、原型设计

1.2.1 UI 分析

1.2.2    架构分析

架构分为:

(1)、solr服务器。(已经做完,同入门示例)

(2)、自己开发的应用(重点)

(3)、数据库mysql

自己开发的应用

Controller      负责和前端页面进行请求和响应的交互

Service        封装查询条件,调用dao。

Dao           搜索索引库,返回搜索结果。

1.3. 环境准备

Solr:4.10.3

Jdk环境:1.7.0_72(solr4.10 不能使用jdk1.7以下)

Ide环境:Eclipse

Web服务器(servlet容器):Tomcat 7+

1.4   代码实现

1.4.1. 实现步骤

第一部分:SpringMVC框架搭建

第二部分:整合Spring与Solr (Solr服务已经搭建好了)

第三部分:实现功能

1.4.2. 实现步骤

1.4.2.1. 第一部分:SpringMVC框架搭建

--新建一个动态网站项目导入SpringMVC的Jar包

第一步:导入SpringMVC依赖包

1.4.2.2..     第二步:创建一个请求页面
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html>
4 <html>
5 <head>
6 <meta charset="UTF-8">
7 <title>Insert title here</title>
8 </head>
9 <body>
10
11 <a href="${pageContext.request.contextPath }/say">say hello</a>
12 </body>
13 </html>
1.4.2.3     第三步:web.xml配置(入口)
 1 <?xml version="1.0" encoding="UTF-8"?>
2 <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
3 xmlns="http://xmlns.jcp.org/xml/ns/javaee"
4 xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
5 id="WebApp_ID" version="3.1">
6 <display-name>solr-demo-02-jd</display-name>
7 <!-- 配置编码过滤器 -->
8 <filter>
9 <filter-name>characterEncodingFilter</filter-name>
10 <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
11 <!-- 指定编码 -->
12 <init-param>
13 <param-name>encoding</param-name>
14 <param-value>UTF-8</param-value>
15 </init-param>
16 </filter>
17 <filter-mapping>
18 <filter-name>characterEncodingFilter</filter-name>
19 <url-pattern>/*</url-pattern>
20 </filter-mapping>
21 <!-- 核心控制器 -->
22 <servlet>
23 <servlet-name>dispatcherServlet</servlet-name>
24 <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
25 <!-- 读取指定的配置文件 -->
26 <init-param>
27 <param-name>contextConfigLocation</param-name>
28 <param-value>classpath:spring-*.xml</param-value>
29 </init-param>
30 <!-- 随web server启动 -->
31 <load-on-startup>1</load-on-startup>
32 </servlet>
33 <servlet-mapping>
34 <servlet-name>dispatcherServlet</servlet-name>
35 <url-pattern>/</url-pattern>
36 </servlet-mapping>
37
38 </web-app>
1.4.2.4     第四步:配置Spring配置文件
 1 <?xml version="1.0" encoding="UTF-8"?>
2 <beans xmlns="http://www.springframework.org/schema/beans"
3 xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
4 xmlns:mvc="http://www.springframework.org/schema/mvc"
5 xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd
6 http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
7
8 <!-- 启动注解默认支持 -->
9 <mvc:annotation-driven />
10 <!-- 放开默认静态资源访问 -->
11 <mvc:default-servlet-handler/>
12
13 <!-- 配置视图解释器 -->
14 <mvc:view-resolvers>
15 <mvc:jsp prefix="/" suffix=".jsp"/>
16 </mvc:view-resolvers>
17
18
19 </beans>

--context配置文件,spring-context.xml

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:context="http://www.springframework.org/schema/context"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.3.xsd"> <!-- 扫描组件配置 -->
<context:component-scan base-package="org.chu"></context:component-scan> </beans>
1.4.2.5   第五步:配置业务控制器
 1 @Controller
2 public class PageController {
3
4 @RequestMapping(value="/{page}")
5 public String showPage(@PathVariable String page) {
6 System.out.println("-HelloWorld:"+page);
7 return page;
8 }
9
10 }
1.4.2.6     第六步:配置返回页面
 1 <%@ page language="java" contentType="text/html; charset=UTF-8"
2 pageEncoding="UTF-8"%>
3 <!DOCTYPE html>
4 <html>
5 <head>
6 <meta charset="UTF-8">
7 <title>Insert title here</title>
8 </head>
9 <body>
10 你好世界
11 </body>
12 </html>

第二部分:整合Spring与Solr

注意事项:

必须要将Solr的Tomcat服务器的端口配置与项目运行的Tomcat的端口不一样。因为如果在同一个电脑上同时运行两个Tomcat,端口不修改就会冲突。

第一步:修改Solr服务器端口

前提:Solr服务器已经准备好。

--Tomcat的conf/server.xml文件中,修改端口

--tomcat端口说明:

8005:关机端口, 修改为:8006

 8080:默认服务端口,修改为 :8888

8009:请求转向端口,修改为:8010

第二步:导入Solr的连接依赖包

--将以下的jar 加入到项目的WEB-INF/lib里面。

--日志处理包

--solrj依赖包

第三步:加入Log4j的支持

在classpath根目录加入lo4j.properties。该文件可以在solr的包里面找到

第四步:在spring-context.xml配置Solr
<!-- 配置Solr整合的连接对象 -->
<bean name="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
<!-- 通过构造方法指定请求的路径 -->
<constructor-arg index="0" value="http://localhost:8888/solr/soreCore0225" />
</bean>

第三部分:功能实现

第一步:导入页面资源

--将准备的资料放在webapp,网站根目录。并且删除原来测试的页面,test.jsp以及say.jsp。

结果如下:

第二步:导入JSTL的支持

第三步:编写JavaBean
 1 public class Product {
2 // 商品编号
3 private String pid;
4 // 商品名称
5 private String name;
6 // 商品分类名称
7 private String catalogName;
8 // 价格
9 private double price;
10 // 商品描述
11 private String description;
12 // 图片名称
13 private String picture;
14 //补全get、set方法
15 }

--业务模型(Value Object VO),编写ResultModel业务模型

 1 import java.util.List;
2
3 public class ResultModel {
4
5 private List<Product> productList;
6 // 商品总数
7 private Long recordCount;
8 // 总页数
9 private int pageCount;
10 // 当前页
11 private int currentPage;
12 //补全get、set方法
13
14 }
第四步:获得Solr的数据
 1 import java.util.ArrayList;
2 import java.util.List;
3 import org.apache.solr.client.solrj.SolrQuery;
4 import org.apache.solr.client.solrj.impl.HttpSolrServer;
5 import org.apache.solr.client.solrj.response.QueryResponse;
6 import org.apache.solr.common.SolrDocument;
7 import org.apache.solr.common.SolrDocumentList;
8 import org.chu.dao.ProductDAO;
9 import org.chu.pojo.Product;
10 import org.chu.pojo.ResultModel;
11 import org.springframework.beans.factory.annotation.Autowired;
12 import org.springframework.stereotype.Repository;
13 @Repository
14 public class ProductDAOImpl implements ProductDAO{
15 @Autowired
16 private HttpSolrServer solrServer;
17 @Override
18 public ResultModel queryProduct(SolrQuery query) throws Exception {
19
20 //创建一个返回的业务模型对象
21 ResultModel resultModel=new ResultModel();
22 //第一步:获得Solr响应对象
23 QueryResponse response = solrServer.query(query);
24 //第二步:获得返回的结果集
25 SolrDocumentList results = response.getResults();
26 //第三步:将SolrDocumentList集合对象转成List<Product>
27 List<Product> products=new ArrayList<>();
28 // 设置高亮信息
29 Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
30 for (SolrDocument solrDocument : results) {
31 Product product=new Product();
32 product.setPid((String)solrDocument.get("id"));
33 // 设置高亮信息
34 List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");
35
36 String prodName = (String) solrDocument.get("product_name");
37 if (list != null)prodName = list.get(0);
38 product.setName(prodName);
39 product.setCatalogName((String) solrDocument.get("product_catalog_name"));
40 product.setPicture((String) solrDocument.get("product_picture"));
41 product.setDescription((String) solrDocument.get("product_description"));
42 product.setPrice((Double) solrDocument.get("product_price"));
43 products.add(product);
44 }
45 //第四步:将数据封装到ResultModel
46 //总记录书
47 resultModel.setRecordCount(results.getNumFound());
48 //查询的的结果
49 resultModel.setProductList(products);
50 return resultModel;
51 }
52 }
第五步:构造Service
import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.chu.dao.ProductDAO;
import org.chu.pojo.ResultModel;
import org.chu.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service; @Service
public class ProductServiceImpl implements ProductService { @Autowired
private ProductDAO productDAO; @Override
public ResultModel queryProduct(String queryString, String cataName, String price, String sort, Integer curPage)
throws Exception {
//构建查询的条件
SolrQuery query=new SolrQuery(); //判断关键字不为空
if (queryString!=null&&!"".equals(queryString)) { query.set("q", queryString);
}else {
query.set("q", "*:*");
} //增加过滤条件
if (cataName!=null&&!"".equals(cataName)) {
query.addFilterQuery("product_catalog_name:"+cataName);
} //价格过滤
if (price!=null&&!"".equals(price)) {
String[] prices = price.split("-");
query.addFilterQuery("product_price:[ "+prices[0]+" TO "+prices[1]+" ]");
} //排序,1:desc ,非1就,asc
if (sort!=null&&sort.equals("1")) {
query.setSort("product_price", ORDER.desc);
}else{
query.setSort("product_price", ORDER.asc);
} //设置分页
//如果没有值,就为第一页
if (curPage==null) {
curPage=1;
}
//设置查询的开始位置
query.setStart((curPage-1)*20);
//设置每页记录数
query.setRows(20); query.set("df", "product_name"); //高亮分词设置
query.setHighlight(true);
//设置高亮的字段
query.addHighlightField("product_name");
//通过标签设置颜色 //开始标签
query.setHighlightSimplePre("<font style=\"color:red\">");
query.setHighlightSimplePost("</font>"); ResultModel resultModel = productDAO.queryProduct(query); //返回结果后,封装请求的数据到业务模型里面
resultModel.setCurrentPage(curPage); // 总页数 = 总数量 / 每页数据条数 结果向上取整
double ceil = Math.ceil(resultModel.getRecordCount().doubleValue()/20);
resultModel.setPageCount((int)ceil); return resultModel;
} }
构建Controller
import org.chu.pojo.ResultModel;
import org.chu.service.ProductService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.ModelMap;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam; @Controller
public class ProductController { @Autowired
private ProductService productService; @RequestMapping(value="/list")
public String list(String queryString, @RequestParam("catalog_name") String catalogName,String price, String sort, Integer curPage, ModelMap model) {
try {
ResultModel resultModel = productService.queryProduct(queryString, catalogName, price, sort, curPage);
model.addAttribute("result", resultModel); model.addAttribute("queryString", queryString);
model.addAttribute("catalog_name", catalogName);
model.addAttribute("price", price);
model.addAttribute("sort", sort);
model.addAttribute("page", curPage); } catch (Exception e) {
e.printStackTrace();
} return "product_list";
} }

solr综合案例的更多相关文章

  1. Solr综合案例深入练习

    1. 综合案例 1.1. 需求 使用Solr实现电商网站中商品信息搜索功能,可以根据关键字.分类.价格搜索商品信息,也可以根据价格进行排序,并且实现分页功能. 界面如下: 1.2. 分析 开发人员需要 ...

  2. JavaScript:综合案例-表单验证

    综合案例:表单验证 开发要求: 要求定义一个雇员信息的增加页面,例如页面名称为"emp_add.htmnl",而后在此页面中要提供有输入表单,此表单定义要求如下: .雇员编号:必须 ...

  3. DOM综合案例、SAX解析、StAX解析、DOM4J解析

    今日大纲 1.DOM技术对xml的增删操作 2.使用DOM技术完成联系人管理 3.SAX和StAX解析 4.DOM4J解析 5.XPATH介绍 1.DOM的增删操作 1.1.DOM的增加操作 /* * ...

  4. JavaEE Tutorials (30) - Duke综合案例研究示例

    30.1Duke综合应用的设计和架构456 30.1.1events工程458 30.1.2entities工程459 30.1.3dukes—payment工程461 30.1.4dukes—res ...

  5. jquery-easyUI第二篇【综合案例】

    基于easyUI开发的一个综合案例模版 <%@ page language="java" pageEncoding="UTF-8"%> <!D ...

  6. CSS3_综合案例

    综合案例 设置元素的 width,还可以利用 left 和 right 为了防止图片太小,background-size: 100% 100%; <!DOCTYPE html> <h ...

  7. Angular路由与多视图综合案例

    Ajax请求存在的几个问题 (1)Ajax请求不会留下History 记录,会导致浏览器后退按钮失效 (2)用户无法直接通过URL进入应用中的指定页面(保存书签.链接分享给朋友) (3)Ajax对SE ...

  8. Winform开发框架中的综合案例Demo

    在实际的系统开发中,我们往往需要一些简单的的案例代码,基于此目的我把Winform开发框架中各种闪光点和不错的功能,有些是我们对功能模块的简单封装,而有些则是引入了一些应用广泛的开源组件进行集成使用, ...

  9. 【原创 Hadoop&Spark 动手实践 13】Spark综合案例:简易电影推荐系统

    [原创 Hadoop&Spark 动手实践 13]Spark综合案例:简易电影推荐系统

随机推荐

  1. git 生成并添加 SSH key

    git config --global user.name "wangjunqiang" git config --global user.email "wangjunq ...

  2. 为何要做seo关键词排名

    http://www.wocaoseo.com/thread-229-1-1.html 武汉seo百度指数在150左右,做seo的同仁们都知道这样的一件事情. 真正搜索武汉seo关键词能作为潜在客户的 ...

  3. 认证授权:学习OIDC

    前言 上一篇文章介绍了OAuth2.0协议的相关内容,知道OAuth2.0是一个授权协议,无法提供完善的身份认证功能.那么什么来解决身份认证功能呢?——OIDC是一个不错的解决方案.接下来进一步来了解 ...

  4. spring cloud 路由

    Spring Cloud Feign:用于微服务之间,只映射内网ip Spring Cloud Gateway:用于服务端,对外开放的接口,对外统一访问gateway映射的ip 是这样吗? 但是这样权 ...

  5. 初级知识六——C#事件通知系统实现(观察者模式运用)

    观察者模式,绝对是游戏中十分重要的一种模式,运用这种模式,可以让游戏模块间的通信变得简单,耦合度也会大大降低,下面讲解如何利用C#实现事件通知系统. 补充,首先说下这个系统的实现原理,不然一头扎进去就 ...

  6. Weights and Measures (贪心+dp)

    I know, up on top you are seeing great sights, But down at the bottom, we, too, should have rights. ...

  7. Java8 ParallelStream

    ParallelStream 并行流就是一个把内容拆分成多个数据块,用不同线程分别处理每个数据块的流.对收集源调用parallelStream方法就能将集合转换为并行流. 并行流 并行流和顺序流转换 ...

  8. 20190928-01Redis五大数据类型之Hash和Zset 000 029

  9. java实现内网通信

    package newTest; import java.io.OutputStream; import java.net.ServerSocket; import java.net.Socket; ...

  10. linux系统jdk安装

    1.软件包下载:官网 http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html下载linu ...