lucene之solr京東案例

  • 新建web工程

  • 導入jar包

 

  • 編寫springmvc配置文件

<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"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop" xmlns:tx="http://www.springframework.org/schema/tx"
    xmlns:task="http://www.springframework.org/schema/task" xmlns:dubbo="http://code.alibabatech.com/schema/dubbo"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
        http://www.springframework.org/schema/beans/spring-beans-4.0.xsd 
        http://www.springframework.org/schema/mvc 
        http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd 
        http://www.springframework.org/schema/context 
        http://www.springframework.org/schema/context/spring-context-4.0.xsd 
        http://www.springframework.org/schema/aop 
        http://www.springframework.org/schema/aop/spring-aop-4.0.xsd 
        http://www.springframework.org/schema/tx 
        http://www.springframework.org/schema/tx/spring-tx-4.0.xsd
        http://www.springframework.org/schema/task
           http://www.springframework.org/schema/task/spring-task-4.0.xsd
        http://code.alibabatech.com/schema/dubbo        
        http://code.alibabatech.com/schema/dubbo/dubbo.xsd">

    <!-- 配置組件掃描 -->
    <context:component-scan base-package="com.jd.controller" />

    <!-- 配置處理器映射器 -->
    <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping" 
        /> -->
    <!-- 配置處理器適配器 -->
    <!-- <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter" 
        /> -->

    <!-- 配置處理器映射器 -->
    <!-- 配置處理器適配器 -->
    <mvc:annotation-driven></mvc:annotation-driven>
    <!-- 配置視圖解析器 -->
    <bean
        class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/" />
        <property name="suffix" value=".jsp" />
    </bean>

</beans>
  • 編寫web.xml

 

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd" id="WebApp_ID" version="2.5">
  <display-name>solrJD</display-name>
  
  <!-- 配置springmvc前端控制器 -->
  <servlet>
      <servlet-name>spmvc</servlet-name>
      <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
      <init-param>
          <param-name>contextConfigLocation</param-name>
          <param-value>classpath:springmvc.xml</param-value>
      </init-param>
      <!-- 服務器啓動時建立servlet實例 -->
      <load-on-startup>5</load-on-startup>
  </servlet>
  <servlet-mapping>
      <servlet-name>spmvc</servlet-name>
      <url-pattern>*.action</url-pattern>
  </servlet-mapping>
  
  <welcome-file-list>
    <welcome-file>index.html</welcome-file>
    <welcome-file>index.htm</welcome-file>
    <welcome-file>index.jsp</welcome-file>
  </welcome-file-list>
</web-app>

 

  •  導入靜態資源文件

  • 創建包結構

  • 建立pojo

商品實體類html

package com.jd.pojo;

public class Product {
    // 商品編號
    private String pid;
    // 商品名稱
    private String name;
    // 商品分類名稱
    private String catalog_name;
    // 價格
    private float price;
    // 商品描述
    private String description;
    // 圖片名稱
    private String picture;

    public String getPid() {
        return pid;
    }

    public void setPid(String pid) {
        this.pid = pid;
    }

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getCatalog_name() {
        return catalog_name;
    }

    public void setCatalog_name(String catalog_name) {
        this.catalog_name = catalog_name;
    }

    public float getPrice() {
        return price;
    }

    public void setPrice(float price) {
        this.price = price;
    }

    public String getDescription() {
        return description;
    }

    public void setDescription(String description) {
        this.description = description;
    }

    public String getPicture() {
        return picture;
    }

    public void setPicture(String picture) {
        this.picture = picture;
    }

}

 

封裝分頁實體類前端

package com.jd.pojo;

import java.util.List;

public class ResultModel {
    // 商品列表
    private List<Product> list;
    // 商品總數
    private Long recordCount;
    // 總頁數
    private Long pageCount;
    // 當前頁
    private long curPage;
    
    public List<Product> getList() {
        return list;
    }
    public void setList(List<Product> list) {
        this.list = list;
    }
    public Long getRecordCount() {
        return recordCount;
    }
    public void setRecordCount(Long recordCount) {
        this.recordCount = recordCount;
    }
    public Long getPageCount() {
        return pageCount;
    }
    public void setPageCount(Long pageCount) {
        this.pageCount = pageCount;
    }
    public long getCurPage() {
        return curPage;
    }

    public void setCurPage(long curPage) {
        this.curPage = curPage;
    }
    
    
}
  •  ProductMapper
package com.jd.mapper;

import org.apache.solr.client.solrj.SolrQuery;

import com.jd.pojo.Product;
import com.jd.pojo.ResultModel;

public interface ProductMapper {
    /**
     * 分頁條件查詢全部商品
     * @param solrQuery
     * @return
     * @throws Exception 
     */
    public ResultModel<Product> findAll(SolrQuery solrQuery) throws Exception;
}
  • ProductMapperImpl
package com.jd.mapper;

import java.util.ArrayList;
import java.util.List;
import java.util.Map;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrServer;
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.springframework.stereotype.Repository;

import com.jd.pojo.Product;
import com.jd.pojo.ResultModel;
@Repository
public class ProductMapperImpl implements ProductMapper {

    @Override
    public ResultModel<Product> findAll(SolrQuery solrQuery) throws Exception {
        // 建立鏈接solr服務器對象
        SolrServer solrServer = new HttpSolrServer("http://localhost:8080/solr/collection1");
        // 建立ResultModel對象
        ResultModel<Product> results = new ResultModel<Product>();
        // 建立集合,存儲Product
        List<Product> productList = new ArrayList<Product>();
        // 執行查詢
        QueryResponse queryResponse = solrServer.query(solrQuery);
        // 獲取Document結果集
        SolrDocumentList solrDocumentList = queryResponse.getResults();
        // 設置總記錄數
        results.setRecordCount(solrDocumentList.getNumFound());
        // 高亮顯示
        Map<String, Map<String, List<String>>> highlighting = queryResponse.getHighlighting();
        // 遍歷結果集
        for (SolrDocument doc : solrDocumentList) {
            // 建立Product對象
            Product product = new Product();

            // 設置商品的編號
            product.setPid((String) doc.get("id"));
            List<String> list = highlighting.get(doc.get("id")).get("product_name");
            if (list == null) {
                // 設置商品的名稱
                product.setName((String) doc.get("product_name"));
            } else {
                // 設置高亮顯示名稱
                product.setName(list.get(0));
            }

            // 設置商品分類名稱
            product.setCatalog_name((String) doc.get("product_catalog_name"));
            // 設置商品價格
            product.setPrice((Float) doc.get("product_price"));
            // 設置商品圖片名稱
            product.setPicture((String) doc.get("product_picture"));
            // 將商品添加到集合中
            productList.add(product);
        }
        results.setList(productList);
        return results;
    }

}
  • ProductService
package com.jd.service;

import com.jd.pojo.Product;
import com.jd.pojo.QueryVo;
import com.jd.pojo.ResultModel;

public interface ProductService {
    /**
     * 分頁條件查詢全部商品
     * 
     * @param solrQuery
     * @return
     * @throws Exception
     */
    public ResultModel<Product> findAll(QueryVo queryVo) throws Exception;
}
  • ProductServiceImpl
package com.jd.service;

import org.apache.solr.client.solrj.SolrQuery;
import org.apache.solr.client.solrj.SolrQuery.ORDER;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;

import com.jd.mapper.ProductMapper;
import com.jd.pojo.Product;
import com.jd.pojo.QueryVo;
import com.jd.pojo.ResultModel;
/**
 * 實現類
 * @author Easong
 *
 */
@Service
public class ProductServiceImpl implements ProductService {

    // 每頁顯示的條數
    private final static Integer PAGE_SIZE = 32;

    @Autowired
    private ProductMapper productMapper;

    @Override
    public ResultModel<Product> findAll(QueryVo queryVo) throws Exception {

        // 建立solr查詢對象
        SolrQuery solrQuery = new SolrQuery();

        // 設置查詢關鍵字
        if (queryVo.getQueryString() != null && !"".equals(queryVo.getQueryString())) {
            solrQuery.setQuery(queryVo.getQueryString());
        } else {
            solrQuery.setQuery("*:*");
        }

        // 設置過濾查詢--商品類別
        if (queryVo.getCatalog_name() != null && !"".equals(queryVo.getCatalog_name())) {
            solrQuery.setFilterQueries("product_catalog_name:" + queryVo.getCatalog_name());
        }

        // 設置價格排序
        if ("1".equals(queryVo.getSort())) {
            // 升序
            solrQuery.setSort("product_price", ORDER.asc);
        } else if("0".equals(queryVo.getSort())){
            // 降序
            solrQuery.setSort("product_price", ORDER.desc);
        }
        // 設置價格查詢區間
        if (queryVo.getPrice() != null && !"".equals(queryVo.getPrice())) {
            String[] split = queryVo.getPrice().split("-");
            if (split != null && split.length > 1) {
                solrQuery.setFilterQueries("product_price:[" + split[0] + " TO " + split[1] + "]");
            }
        }

        // 分頁查詢
        if (queryVo.getPage() == null) {
            queryVo.setPage(1);
        }
        Integer currPage = queryVo.getPage();
        // 開始索引
        solrQuery.setStart((currPage - 1) * PAGE_SIZE);
        // 每頁顯示條數
        solrQuery.setRows(PAGE_SIZE);

        // 設置默認搜索域
        solrQuery.set("df", "product_keywords");
        // 開啓高亮顯示
        solrQuery.setHighlight(true);
        // 設置顯示域名
        solrQuery.addHighlightField("product_name");
        // 設置前綴
        solrQuery.setHighlightSimplePre("<span style=\"color:red\">");
        // 設置後綴
        solrQuery.setHighlightSimplePost("</span>");
        // 調用Mapper層
        ResultModel<Product> resultModel = productMapper.findAll(solrQuery);
        // 設置當前頁
        resultModel.setCurPage(currPage.longValue());
        // 設置總頁數
        Double pageSize = Math.ceil(resultModel.getRecordCount().doubleValue() / PAGE_SIZE);
        resultModel.setPageCount(pageSize.longValue());
        return resultModel;
    }

}
  • ProductController
package com.jd.controller;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.web.bind.annotation.RequestMapping;

import com.jd.pojo.Product;
import com.jd.pojo.QueryVo;
import com.jd.pojo.ResultModel;
import com.jd.service.ProductService;

@Controller
public class ProductController {

    @Autowired
    private ProductService productService;

    @RequestMapping("/list")
    public String list(QueryVo queryVo, Model model) throws Exception {
        ResultModel<Product> resultModel = productService.findAll(queryVo);
        // 將結果存入到model域中
        model.addAttribute("list", resultModel);
        // 查詢條件回顯
        model.addAttribute("queryString", queryVo.getQueryString());
        model.addAttribute("catalog_name", queryVo.getCatalog_name());
        model.addAttribute("price", queryVo.getPrice());
        model.addAttribute("curPage", queryVo.getPage());
        model.addAttribute("sort", queryVo.getSort());

        return "product_list";
    }
}
    •  源碼地址以及靜態頁面  連接: https://pan.baidu.com/s/1miLjfkc 密碼: ysks
相關文章
相關標籤/搜索