Solr綜合案例深刻練習

1. 綜合案例

1.1. 需求

使用Solr實現電商網站中商品信息搜索功能,能夠根據關鍵字、分類、價格搜索商品信息,也能夠根據價格進行排序,而且實現分頁功能。html

界面以下:前端

 

1.2. 分析

開發人員須要的文檔靜態頁面(根據UI設計由美工給出)、數據庫設計、原型設計java

1.2.1. UI分析

 

1.2.2. 架構分析

 

 

 

架構分爲mysql

1)、solr服務器。(已經作完,同入門示例)web

2)、本身開發的應用(重點)spring

3)、數據庫mysqlsql

 

本身開發的應用數據庫

Controller      負責和前端頁面進行請求和響應的交互apache

Service        封裝查詢條件,調用daospring-mvc

Dao           搜索索引庫,返回搜索結果。

1.3. 環境準備

Solr4.10.3

Jdk環境1.7.0_72solr4.10 不能使用jdk1.7如下

Ide環境Eclipse

Web服務器servlet容器):Tomcat 7+

1.4. 代碼實現

1.4.1. 實現步驟

第一部分:SpringMVC框架搭建

第二部分:整合SpringSolr Solr服務已經搭建好了)

第三部分:實現功能

 

1.4.2. 實現步驟

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

1.4.2.1.1. 第一步:導入SpringMVC依賴包

--新建一個動態網站項目導入SpringMVCJar

 

 

1.4.2.1.2. 第二步:建立一個請求頁面

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

 

1.4.2.1.3. 第三步:web.xml配置(入口)

<?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>

 

1.4.2.1.4. 第四步:配置Spring配置文件

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

 

1.4.2.1.5. 第五步:配置業務控制器

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;

}

 

}

 

1.4.2.1.6. 第六步:配置返回頁面

--返回頁面爲:/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>

1.4.2.2. 第二部分:整合SpringSolr

 

注意事項:

必需要將SolrTomcat服務器的端口配置與項目運行的Tomcat的端口不同。由於若是在同一個電腦上同時運行兩個Tomcat,端口不修改就會衝突。

 

1.4.2.2.1. 第一步:修改Solr服務器端口

前提:Solr服務器已經準備好。

 

--Tomcatconf/server.xml文件中,修改端口

--tomcat端口說明:

   8005:關機端口 修改成:8006

   8080:默認服務端口修改成 8888

   8009:請求轉向端口修改成:8010

 

1.4.2.2.2. 第二步:導入Solr的鏈接依賴包

--將如下的jar 加入到項目的WEB-INF/lib裏面。

--日誌處理包

 

--solrj依賴包

 

 

1.4.2.2.3. 第三步:加入Log4j的支持

classpath根目錄加入lo4j.properties。該文件能夠在solr的包裏面找到

 

 

 

1.4.2.2.4. 第四步:在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>

 

1.4.2.3. 第三部分:功能實現

1.4.2.3.1. 第一步:導入頁面資源

前提:準備資料

 

 

 

--將準備的資料放在webapp,網站根目錄。而且刪除原來測試的頁面,test.jsp以及say.jsp

結果以下:

 

 

 

 

1.4.2.3.2. 第二步:導入JSTL的支持

--咱們發現頁面報錯。

 

 

--加入jstl的依賴包

 

 

 

1.4.2.3.3. 第三步:編寫JavaBean

--編寫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;

  //補全getset方法

}

--業務模型(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;

  //補全getset方法

 

}

 

1.4.2.3.4. 第四步:得到Solr的數據

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;

}

}

 

1.4.2.3.5. 第五步:構造Service

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;

}

 

}

 

 

1.4.2.3.6. 第六步:構建Controller

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

}

 

}

 

1.4.2.3.7. 第七部:測試

相關文章
相關標籤/搜索