在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";    }}
原创粉丝点击