zoukankan      html  css  js  c++  java
  • solrj操作solr索引库(流程)

    声明:博主自己记录以免忘记,所以无逻辑无参考价值。小女子就是酱紫任性

    ---------首先dao层

    访问索引库的类。定义一些通用的数据访问方法。

    业务逻辑就是查询索引库。

    参数:SolrQuery对象

    业务逻辑:

    1、根据Query对象进行查询。

    2、返回查询结果。List<SearchItem>、查询结果的总记录数。

    需要把返回结果封装到pojo中,至少包含两个属性:List<SearchItem>、Long recordCount

    再包含一个总页数。

    @Repository
    public class ItemSearchDao {
        //注入一个solrserver((springmvc中已配)
        @Autowired
        private SolrServer solrServer;
        public SearchResult search(SolrQuery query) throws Exception{
            //根据query对象查询索引库
            QueryResponse response = solrServer.query(query);
            //获得商品列表
            SolrDocumentList results = response.getResults();
            List<SearchItem> itemList = new ArrayList<SearchItem>();
            //商品列表
            for (SolrDocument solrDocument : results) {
                SearchItem item = new SearchItem();
                item.setId((Long) solrDocument.get("id"));
                item.setCategory_name((String) solrDocument.get("item_category_name"));
                item.setImage((String) solrDocument.get("item_image"));
                item.setPrice((long) solrDocument.get("item_price"));
                item.setSell_point((String) solrDocument.get("item_sell_point"));
                //取高亮显示
                Map<String, Map<String, List<String>>> highlighting = response.getHighlighting();
                List<String> list = highlighting.get(solrDocument.get("id")).get("item_title");
                String itemTitle = "";
                //有高亮显示的内容时。
                if (list != null && list.size() > 0) {
                    itemTitle = list.get(0);
                } else {
                    itemTitle = (String) solrDocument.get("item_title");
                }
                item.setTitle(itemTitle);
                //添加到商品列表
                itemList.add(item);
            }
            SearchResult result = new SearchResult();
            result.setItemList(itemList);
            result.setRecordCount(results.getNumFound());
            return result;
        }
    }

    -----接着service层

    参数:queryString:查询条件

          Page:页码

          Rows:每页显示的记录数。

    业务逻辑:

    1、创建一个SolrQuery对象。

    2、设置查询条件

    3、设置分页条件

    4、需要指定默认搜索域。

    5、设置高亮

    6、执行查询,调用SearchDao。得到SearchResult

    7、需要计算总页数。

    8、返回SearchResult

    返回值:SearchResult

    public class SearchServiceImpl implements SearchService {
        // 注入dao
        @Autowired
        private ItemSearchDao itemSearchDao;

        @Override
        public SearchResult search(String queryString, int page, int rows)
                throws Exception {
            // 1、创建一个SolrQuery对象。
            SolrQuery solrQuery = new SolrQuery();
            // 2、设置查询条件
            solrQuery.set(queryString);
            // 3、设置分页条件
            solrQuery.setStart((page-1)*rows);
            solrQuery.setRows(rows);
            // 4、需要指定默认搜索域。
            solrQuery.set("df","item_title");
            // 5、设置高亮
            solrQuery.setHighlight(true);
              //高亮的前缀后缀 还有高亮显示域
            solrQuery.addHighlightField("item_title");
            solrQuery.setHighlightSimplePre("<em style="color:red">");
            solrQuery.setHighlightSimplePost("</em>");
            // 6、执行查询,调用SearchDao。得到SearchResult
            SearchResult result = itemSearchDao.search(solrQuery);
            // 7、需要计算总页数。 还要判断
            long recordCount = result.getRecordCount();
            long pageCount = recordCount / rows;
            if(recordCount % rows >0){
                pageCount++;
            }
            result.setPageCount(pageCount);
            // 8、返回SearchResult
            return result;
        }
    }

    (别忘了dubbo要声明暴露的接口)

    ------最后表现层

    请求的url:/search

    参数:

    1、q 查询条件。

    2、page 页码。默认为1

    返回值:

    逻辑视图,返回值。String。

     业务逻辑:

    1、接收参数

    2、调用服务查询商品列表

    3、把查询结果传递给页面。需要参数回显。

    @Controller
    public class SearchController {
        @Autowired
        private SearchService searchService;
        @Value("${ITEM_COUNT}")
        private Integer ITEM_COUNT;

        @RequestMapping("/search")
        public String search(@RequestParam("q") String querString,
                @RequestParam(defaultValue = "1") Integer page, Model model)
                throws Exception {

        querString = new String(querString.getBytes("iso8859-1"),"utf-8");
            SearchResult result = searchService
                    .search(querString, page, ITEM_COUNT);
            // 传递给页面
            model.addAttribute("query", querString);
            model.addAttribute("totalPages", result.getPageCount());
            model.addAttribute("itemList", result.getItemList());
            model.addAttribute("page", page);

            return "search";
        }
    }

  • 相关阅读:
    如何使用分布式锁
    深入理解 ValueTask
    Tuple VS ValueTuple
    RxJS——调度器(Scheduler)
    RxJS——主题(Subject)
    RxJS——Operators
    RxJS——订阅(Subscription)
    RxJS——可观察的对象(Observable)
    Ext.Net 使用总结之GridPanel的删除事件
    使用 NuGet 管理项目库
  • 原文地址:https://www.cnblogs.com/lucia557/p/7583200.html
Copyright © 2011-2022 走看看