e3商城_day07

一.solr业务域配置

  1.确定数据库中哪些表的哪些字段需要作为业务域,再schame.xml中定义业务域;定义域的同时,有些域可能要进行分词,所以得在schame.xml中配置fieldType元素的中文分析器(域,中文分析器以及分析器的配置文件等都是预先在solr服务器上配置好的)

 

 

  2.业务数据导入索引库,有两种方式:

    》借助一个导入数据的第三方插件(在这里由于业务逻辑就不用)

    》通过业务代码查询数据库,返回的数据通过solrj导入到索引库(采用)

    (1)建立e3-search工程,参照e3-content的目录结构创建,并去除掉一些搜索服务中不需要的文件

    (2)查询数据库的操作并不是单表,逆向工程的接口就用不了,自己手动写一个mapper接口,mapper.xml

    (3)查询的商品列表要封装成一个pojo对象,在common的pojo包下创建实体类:SearchItem

      (4)在search-dao书写mapper和mapper.xml

      (5)search-service书写调用mapper的查询接口和导入索引库的接口

    (6)在manager-web下书写新的controller,引用search-service

    (7)dubbo暴露服务和引用服务

二.搜索系统工程的搭建

  1.根据potal-web的目录结构,创建search-web工程

三.商品搜索-dao;书写一个方法,参数是query对象,执行query返回封装了商品列表和总记录数的pojo对象

    @Override
    public SearchResult getSearchItemLsitAndRecordCounts(SolrQuery query) throws SolrServerException {
        
        //执行查询
        QueryResponse response = solrServer.query(query);
        
        //得到文档集
        SolrDocumentList docList = response.getResults();
        
        //创建searchResult
        SearchResult searchResult = new SearchResult();
        
        //得到记录数并设置
        long recordCounts = docList.getNumFound();
        
        searchResult.setRecordCounts((int) recordCounts);
        
        //创建List<SearchItem>
        List<SearchItem> itemList = new ArrayList<SearchItem>();
        
        //得到高光的map
        Map<String, Map<String, List<String>>> map = response.getHighlighting();
        
        //遍历文档集,完成数据的转移,得到list
        for (SolrDocument solrDocument : docList) {
            
            SearchItem item = new SearchItem();
            
            item.setId((String) solrDocument.get("id"));
            
            List<String> list = map.get( (String) solrDocument.get("id") ).get("title");
            String title = "";
            
            if( list != null && list.size()>0 ) {
                //高光
                title = list.get(0);
            }else {
                //无高光
                title = (String) solrDocument.get("title");
            }
            
            item.setTitle(title);
            
            //添加item到itemList
            itemList.add(item);
        }
        
        //设置list
        searchResult.setSearchItemList(itemList);
        
        //返回SearchResult
        return searchResult;
    }

四.商品搜索-service

@Service
public class SearchServiceImpl implements SearchService {

    @Autowired
    private SolrDao solrDao;
    
    public SearchResult search(String keyword, Integer page, Integer rows) {
        
        //创建查询对象
        SolrQuery query = new SolrQuery();
        
        //设置查询条件
            //设置查找域
            //设置查找数
            //设置高亮
        
        query.setQuery(keyword);
        //设置默认域
        query.set("df", "keyword");
        
        //若page小于1
        if( page < 1 ) page = 1;
        
        query.setStart( (page -1 ) * rows);
        query.setRows(rows);
        
        //设置高亮
        query.setHighlight(true);
        query.addHighlightField("title");
        query.setHighlightSimplePre("<em>");
        query.setHighlightSimplePost("</em>");
        
        //调用dao,得到SearchResult
        try {
            SearchResult result = solrDao.getSearchItemLsitAndRecordCounts(query);
            
            Integer temp = result.getRecordCounts()/rows;
            
            //总页数
            Integer PageCounts = result.getRecordCounts()%rows==0?temp:temp+1;
            
            //设置总页数
            result.setPageCounts(PageCounts);
            
            //返回SearchResult
            return result;
        } catch (Exception e) {
            e.printStackTrace();
        }
        return null;
    }

}

四.商品搜索-controller

@Controller
public class SearchController {

    @Autowired
    private SearchService searchService;
    
    @RequestMapping("/search")
    public String getSearchItemList(String keyword,
            @RequestParam(defaultValue = "1")Integer page,Model model) {
        
        SearchResult result = searchService.search(keyword, page, 10);
        
        //商品列表
        model.addAttribute("itemList", result.getSearchItemList());
        //总记录数
        model.addAttribute("recordCounts",result.getRecordCounts());
        //总页数
        model.addAttribute("pageCounts",result.getPageCounts());
        
        return "search.jsp";
    }
}

 

posted @ 2020-08-21 17:17  爱编程DE文兄  阅读(186)  评论(0编辑  收藏  举报