solr--7.案列

1      案例实现

1.1    原型分析

1.2    系统架构

2      工程搭建

2.1    加入jar包

创建一个web工程导入jar包

1、springmvc的相关jar包

2、solrJ的jar包

3、Example\lib\ext下的jar包

 

2.2    springmvc.xml(配置solr)

<?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:p="http://www.springframework.org/schema/p"
       xmlns:context="http://www.springframework.org/schema/context"
       xmlns:mvc="http://www.springframework.org/schema/mvc"
       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">

    <!-- 扫描基本包  @Controller  @Service @Respostory -->
    <context:component-scan base-package="com.itheima"/>
    <!-- 三大组件 -->
    <mvc:annotation-driven/>
    <!-- 视图解析器 -->
    <bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">
        <property name="prefix" value="/WEB-INF/jsp/"/>
        <property name="suffix" value=".jsp"/>
    </bean>

    <!-- 配置SOlrJ -->
    <bean id="solrServer" class="org.apache.solr.client.solrj.impl.HttpSolrServer">
        <constructor-arg value="http://192.168.25.101:8080/solr/collection1"/>
    </bean>

</beans>
 

2.3    web.xml

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns="http://xmlns.jcp.org/xml/ns/javaee"
         xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
         xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaeehttp://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd"
         version="3.1">

    <!-- 解决post乱码问题 -->
    <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>jd</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>
        <load-on-startup>1</load-on-startup>
    </servlet>

    <servlet-mapping>
        <servlet-name>jd</servlet-name>
        <url-pattern>*.action</url-pattern>
    </servlet-mapping>
</web-app> 

3      代码

3.1    Pojo

3.1.1  商品对象模型:ProductModel

商品对象模型:ProductModel

public classProductModel {

    // 商品编号
    private String pid;
    // 商品名称
    private String name;
    // 商品分类名称
    private String catalog_name;
    // 价格
    private float price;
    // 商品描述
    private String description;
    // 图片名称
    private String picture;

}

3.1.2  接受模型QueryVo

public class QueryVo {
         //关键词
         private String queryString;
         //过滤条件商品类型
         //价格区间
         private String catalog_name;
         privateString price;
         //排序  1 正   0倒
         privateString sort;

3.2    Dao

3.2.1  功能分析

功能:接收service层传递过来的参数,根据参数查询索引库,返回查询结果。

参数:SolrQuery对象

返回值:一个商品列表List<ProductModel>。

方法定义:publicList<ProductModel> getResultModelFromSolr(QueryVo vo) throws Exception;

商品对象模型: ProductModel

3.2.2  代码实现

@Repository
public class JdDaoImpl implements JdDao {

   // 索引库
   @Autowired
   private SolrServer solrServer;

    通过上面四个条件查询对象商品结果集
   public List<ProductModel> selectProductModelListByQuery(QueryVo vo) throws Exception {

      // 查询 关键词  过滤条件
      // 价格排序 分页 开始行 每页数 高亮 默认域 只查询指定域
      SolrQuery solrQuery = new SolrQuery();
      // 关键词
      solrQuery.setQuery(vo.getQueryString());
      // 过滤条件
      String catalog_name = vo.getCatalog_name();
      if(null != catalog_name && !"".equals(catalog_name)){
         solrQuery.set("fq", "product_catalog_name:" + catalog_name);
      }
      String price = vo.getPrice();
      if(null != price && !"".equals(price)){
         //0-9   50-*
         String[] p = price.split("-");
         solrQuery.set("fq", "product_price:[" + p[0] + " TO " + p[1] + "]");
      }
      // 价格排序
      String sort = vo.getSort();
      if("1".equals(sort)){
         solrQuery.addSort("product_price", ORDER.desc);
      }else{
         solrQuery.addSort("product_price", ORDER.asc);
      }
      // 分页
      solrQuery.setStart(0);
      solrQuery.setRows(16);
      // 默认域
      solrQuery.set("df", "product_keywords");
      // 只查询指定域
      solrQuery.set("fl", "id,product_name,product_price,product_picture");
      // 高亮
      // 打开开关
      solrQuery.setHighlight(true);
      // 指定高亮域
      solrQuery.addHighlightField("product_name");
      // 前缀
      solrQuery.setHighlightSimplePre("<span style='color:red'>");
      solrQuery.setHighlightSimplePost("</span>");

      // 后缀
      // 执行查询
      QueryResponse response = solrServer.query(solrQuery);
      // 文档结果集
      SolrDocumentList docs = response.getResults();

      Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
      // Map K id V Map
      // Map K 域名 V List
      // List list.get(0)
      // 总条数
      long numFound = docs.getNumFound();
      
      List<ProductModel> productModels = new ArrayList<ProductModel>();
   
      for (SolrDocument doc : docs) {
         ProductModel productModel = new ProductModel();
         
         productModel.setPid((String) doc.get("id"));
         productModel.setPrice((Float) doc.get("product_price"));
         productModel.setPicture((String) doc.get("product_picture"));
         Map<String, List<String>> map = highlighting.get((String) doc.get("id"));
         List<String> list = map.get("product_name");
         
         productModel.setName(list.get(0));
         productModels.add(productModel);
      }
      return productModels;
   }
} 

3.3    Service

3.3.1  功能分析

功能:接收action传递过来的参数,根据参数拼装一个查询条件,调用dao层方法,查询商品列表。接收返回的商品列表和商品的总数量,根据每页显示的商品数量计算总页数。

参数:

1、查询条件:字符串

2、商品分类的过滤条件:商品的分类名称,字符串

3、商品价格区间:传递一个字符串,满足格式:“0-100、101-200、201-*”

4、排序条件:页面传递过来一个升序或者降序就可以,默认是价格排序。0:升序1:降序

5、分页信息:每页显示的记录条数创建一个常量60条。传递一个当前页码就可以了。

业务逻辑

1、根据参数创建查询对象

2、调用dao执行查询。

3、根据总记录数计算总页数。

返回值:ResultModel

 

方法定义:ResultModelqueryProduct(String queryString, String caltalog_name, String price, Stringsort, Integer page) throws Exception;

 

3.3.2  代码实现

@Service
public class JdServiceImpl implements JdService {

   @Autowired
   private JdDao jdDao;

   //通过上面四个条件查询对象商品结果集
   public List<ProductModel>selectProductModelListByQuery(QueryVo vo) throws Exception{
      
     return jdDao.selectProductModelListByQuery(vo);
      
   }
} 

3.4    Controller

3.4.1  功能分析

功能:接收页面传递过来的参数调用service查询商品列表。将查询结果返回给jsp页面,还需要查询参数的回显。

 

参数:

1、查询条件:字符串

2、商品分类的过滤条件:商品的分类名称,字符串

3、商品价格区间:传递一个字符串,满足格式:“0-100、101-200、201-*”

4、排序条件:页面传递过来一个升序或者降序就可以,默认是价格排序。0:升序1:降序

5、分页信息:每页显示的记录条数创建一个常量60条。传递一个当前页码就可以了。

6、Model:相当于request。

返回结果:String类型,就是一个jsp的名称。

public class QueryVo

 

3.4.2  代码实现

/**
 * 查询商品列表
 */
@Controller
public class ProductController {

    @Autowired
    private JdService jdService;

    //搜索
    @RequestMapping("/list.action")
    public Stringlist(QueryVo vo, Model model) throws Exception{
        //结果集
        List<ProductModel> productModels = jdService.selectProductModelListByQuery(vo);
        model.addAttribute("productModels", productModels);
        model.addAttribute("catalog_name", vo.getCatalog_name());
        model.addAttribute("price", vo.getPrice());
        model.addAttribute("sort", vo.getSort());
        model.addAttribute("queryString", vo.getQueryString());
        return "product_list";
    }

}


 

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值