@RequestMapping("/search/{categoryId}") public String list(@PathVariable String categoryId, ModelMap model) throws SolrServerException, ParseException { SolrQuery query = new SolrQuery(); query.setQuery("categoryId:" + categoryId); query.setRows(20); SolrDocumentList docs = solrServer.query(query).getResults(); List<Article> articles = new ArrayList<Article>(); for (SolrDocument solrDocument : docs) { Article article = new Article(); article.setTitle(String.valueOf(solrDocument.getFieldValue("title"))); article.setContent(String.valueOf(solrDocument.getFieldValue("content"))); /** solr时间格式转换的坑,具体可参考 http://chengqianl.iteye.com/blog/1340385 */ article.setCreateDate( new SimpleDateFormat("yyyy-MM-dd'T'HH:mm:ss.SSS'Z'") .parse(String.valueOf(solrDocument.getFieldValue("createDate")))); articles.add(article); } model.addAttribute("articles", articles); return "/client/article/list"; }
@RequestMapping("/search") public String search(ModelMap model) throws SolrServerException { SolrQuery query = new SolrQuery(); /** 设置多条filterQuery语句有助于提高内存效率;组合查询条件设置单条filterQuery语句损耗内存多,但可以优化性能 可以采用 AND 或 OR 关键字 来设置查询与或 */ query.setQuery("title:北京 OR content:北京"); query.setRows(20); // 设置高亮 query.setHighlight(true); // 开启高亮组件 query.addHighlightField("title"); // 高亮字段 query.addHighlightField("content"); // 高亮字段 query.setHighlightSimplePre("<font color='red'>"); // 标记,高亮关键字前缀 query.setHighlightSimplePost("</font>"); // 后缀 query .setHighlight(true) .setHighlightSnippets( 1); // 获取高亮分片数,一般搜索词可能分布在文章中的不同位置,其所在一定长度的语句即为一个片段,默认为1,但根据业务需要有时候需要多取出几个分片。 - // 此处设置决定下文中titleList, contentList中元素的个数 query.setHighlightFragsize(150); // 每个分片的最大长度,默认为100。适当设置此值,如果太小,高亮的标题可能会显不全;设置太大,摘要可能会太长。 QueryResponse response = solrServer.query(query); SolrDocumentList docs = response.getResults(); // 获取所有高亮的字段 Map<String, Map<String, List<String>>> highlightMap = response.getHighlighting(); List<Article> articles = new ArrayList<Article>(); for (SolrDocument solrDocument : docs) { Article article = new Article(); List<String> titleList = highlightMap.get(solrDocument.getFieldValue("id")).get("title"); List<String> contentList = highlightMap.get(solrDocument.getFieldValue("id")).get("content"); // 获取并设置高亮的字段title if (titleList != null && titleList.size() > 0) { article.setTitle(titleList.get(0)); } // 获取并设置高亮的字段content if (contentList != null && contentList.size() > 0) { article.setContent(contentList.get(0)); } articles.add(article); } model.addAttribute("articles", articles); return "/client/article/list"; }