在web应用中使用solr(一)

下面在实际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代码

@Service
public 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代码

@Controller
public 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";
    }
}
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值