solrj操作solr索引库(流程)

Posted Lucia557

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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";
    }
}

 

以上是关于solrj操作solr索引库(流程)的主要内容,如果未能解决你的问题,请参考以下文章

Solr

Solr06-SolrJ的使用及其高级查询

Solr09-SolrJ的简介和使用

SolrJ 的运用

Solr JAVA客户端SolrJ 4.9使用示例教程

JAVAEE——Solr:安装及配置后台管理索引库 使用SolrJ管理索引库仿京东的电商搜索案例实现