一.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"; } }