使用Solr實現電商網站中商品信息搜索功能,能夠根據關鍵字、分類、價格搜索商品信息,也能夠根據價格進行排序,而且實現分頁功能。html
界面以下:前端
開發人員須要的文檔:靜態頁面(根據UI設計由美工給出)、數據庫設計、原型設計java
架構分爲:mysql
(1)、solr服務器。(已經作完,同入門示例)web
(2)、本身開發的應用(重點)spring
(3)、數據庫mysqlsql
本身開發的應用數據庫
Controller 負責和前端頁面進行請求和響應的交互apache
Service 封裝查詢條件,調用dao。spring-mvc
Dao 搜索索引庫,返回搜索結果。
Solr:4.10.3
Jdk環境:1.7.0_72(solr4.10 不能使用jdk1.7如下)
Ide環境:Eclipse
Web服務器(servlet容器):Tomcat 7+
第一部分:SpringMVC框架搭建
第二部分:整合Spring與Solr (Solr服務已經搭建好了)
第三部分:實現功能
--新建一個動態網站項目導入SpringMVC的Jar包
|
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body>
<a href="${pageContext.request.contextPath }/say">say hello</a> </body> </html> |
<?xml version="1.0" encoding="UTF-8"?> <web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee" xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1"> <display-name>solr-demo-02-jd</display-name> <!-- 配置編碼過濾器 --> <filter> <filter-name>characterEncodingFilter</filter-name> <filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class> <!-- 指定編碼 --> <init-param> <param-name>encoding</param-name> <param-value>UTF-8</param-value> </init-param> </filter> <filter-mapping> <filter-name>characterEncodingFilter</filter-name> <url-pattern>/*</url-pattern> </filter-mapping> <!-- 核心控制器 --> <servlet> <servlet-name>dispatcherServlet</servlet-name> <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> <!-- 讀取指定的配置文件 --> <init-param> <param-name>contextConfigLocation</param-name> <param-value>classpath:spring-*.xml</param-value> </init-param> <!-- 隨web server啓動 --> <load-on-startup>1</load-on-startup> </servlet> <servlet-mapping> <servlet-name>dispatcherServlet</servlet-name> <url-pattern>/</url-pattern> </servlet-mapping>
</web-app> |
--mvc配置文件,spring-mvc.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:mvc="http://www.springframework.org/schema/mvc" xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.3.xsd http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">
<!-- 啓動註解默認支持 --> <mvc:annotation-driven /> <!-- 放開默認靜態資源訪問 --> <mvc:default-servlet-handler/>
<!-- 配置視圖解釋器 --> <mvc:view-resolvers> <mvc:jsp prefix="/" suffix=".jsp"/> </mvc:view-resolvers>
</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> |
package org.chu.controller;
import org.springframework.stereotype.Controller; import org.springframework.web.bind.annotation.PathVariable; import org.springframework.web.bind.annotation.RequestMapping;
@Controller public class PageController {
@RequestMapping(value="/{page}") public String showPage(@PathVariable String page) { System.out.println("-HelloWorld:"+page); return page; }
} |
--返回頁面爲:/say.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8" pageEncoding="UTF-8"%> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Insert title here</title> </head> <body> 你好世界 </body> </html> |
注意事項:
必需要將Solr的Tomcat服務器的端口配置與項目運行的Tomcat的端口不同。由於若是在同一個電腦上同時運行兩個Tomcat,端口不修改就會衝突。
前提:Solr服務器已經準備好。
--Tomcat的conf/server.xml文件中,修改端口
--tomcat端口說明:
8005:關機端口, 修改成:8006
8080:默認服務端口,修改成 :8888
8009:請求轉向端口,修改成:8010
--將如下的jar 加入到項目的WEB-INF/lib裏面。
--日誌處理包
|
--solrj依賴包
![]()
|
在classpath根目錄加入lo4j.properties。該文件能夠在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的依賴包
|
--編寫Product實體類
package org.chu.pojo;
public class Product { // 商品編號 private String pid; // 商品名稱 private String name; // 商品分類名稱 private String catalogName; // 價格 private double price; // 商品描述 private String description; // 圖片名稱 private String picture; //補全get、set方法 } |
--業務模型(Value Object VO),編寫ResultModel業務模型
package org.chu.pojo;
import java.util.List;
public class ResultModel {
private List<Product> productList; // 商品總數 private Long recordCount; // 總頁數 private int pageCount; // 當前頁 private int currentPage; //補全get、set方法
} |
package org.chu.dao.impl; import java.util.ArrayList; import java.util.List; import org.apache.solr.client.solrj.SolrQuery; import org.apache.solr.client.solrj.impl.HttpSolrServer; import org.apache.solr.client.solrj.response.QueryResponse; import org.apache.solr.common.SolrDocument; import org.apache.solr.common.SolrDocumentList; import org.chu.dao.ProductDAO; import org.chu.pojo.Product; import org.chu.pojo.ResultModel; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.stereotype.Repository; @Repository public class ProductDAOImpl implements ProductDAO{ @Autowired private HttpSolrServer solrServer; @Override public ResultModel queryProduct(SolrQuery query) throws Exception {
//建立一個返回的業務模型對象 ResultModel resultModel=new ResultModel(); //第一步:得到Solr響應對象 QueryResponse response = solrServer.query(query); //第二步:得到返回的結果集 SolrDocumentList results = response.getResults(); //第三步:將SolrDocumentList集合對象轉成List<Product> List<Product> products=new ArrayList<>(); // 設置高亮信息 Map<String, Map<String, List<String>>> highlighting = response.getHighlighting(); for (SolrDocument solrDocument : results) { Product product=new Product(); product.setPid((String)solrDocument.get("id")); // 設置高亮信息 List<String> list = highlighting.get(solrDocument.get("id")).get("product_name");
String prodName = (String) solrDocument.get("product_name"); if (list != null)prodName = list.get(0); product.setName(prodName); product.setCatalogName((String) solrDocument.get("product_catalog_name")); product.setPicture((String) solrDocument.get("product_picture")); product.setDescription((String) solrDocument.get("product_description")); product.setPrice((Double) solrDocument.get("product_price")); products.add(product); } //第四步:將數據封裝到ResultModel //總記錄書 resultModel.setRecordCount(results.getNumFound()); //查詢的的結果 resultModel.setProductList(products); return resultModel; } } |
package org.chu.service.impl;
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; }
}
|
package org.chu.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"; }
}
|
|