小东Freeman + 关注

签名:我们爱我们的倒霉工作,也爱这千疮百孔的世界。

基于solr的文章推荐功能

发表于 10个月前   1178次查看    1评论  10 赞

以前文章详情页的推荐文章是从数据库内随机抽取的十篇文章,通过一段时间的数据分析发现用户点击的次数并不多,所以我分析得到的是推荐文章的内容和用户阅读的内容不符,还有就是位置不好,用户往往看不到,所以针对这两个问题做出了优化,采用solr+ajax的方式进行文章推荐的开发。

QQ截图20180919150528.png

原理

用户点进一篇文章后会获取这篇文章的标题,然后通过ajax将标题发送到solr里面,再利用solr的分词功能检索出最接近这篇文章标题的几篇文章,然后返回到前端再进行遍历,这样就在不影响页面打开速度的基础上获得可能用户感兴趣的文章了。


开发过程

一、配置solr,我们知道solr是apache下的顶级搜索项目,所以需要配置才可以用,因为比较复杂就不讲了,你么可以看我往期的文章或者百度搜索教程就可以了


二、前端开发

1、挑选适合的前端样式

2、ajax部分

<script type="text/javascript">
	$(function(){
        initTuijian();
    });
	function initTuijian(){
	//获取标题
		var head = $("#tuihead").val();
		$.ajax({
		type : "post",
		//后台处理的方法
		url : "find.action",
		//把标题传到后端
		data : "head=" + head + "",
		success : function(data) {
		//获取后端传过来的list开始遍历
		for (var i = 0; i < data.length; i++) {
                //根据自己需要书写遍历主体
		$("#post-action").append(
		"<div class=\"article-list\"><article class=\"article-item\"><div class=\"article-metas clearfix\">"+
		"<div class=\"metas-body\" style=\"padding-left:10px\"><h2 class=\"title\">"+
		"<a href=\"${pageContext.request.contextPath }/p/"+data[i].aid+".html\" target=\"_blank\">"+data[i].head+"</h2>"+
		"</div></div><div class=\"content\" >"+data[i].content+"</div></article></div>");
						}

					},
					error : function() {
						layer.alert('请重试', {
							icon : 2,
							skin : 'layer-ext-moon'
						});
					}
				});
				
				};

	</script>


三、后端开发

1、方法逻辑部分

// 推荐文章ajax
	@RequestMapping("/find")
	public @ResponseBody
	List<Article> find(HttpServletRequest request, Article article,
			Model model, HttpSession session) throws Exception {
		// 实例化solr
		Solr solr = new Solr();
		article.setKeywords(article.getHead());
		article.setStartPage(1);
		//调用solr获取数据
		List<Article> ArtList = solr.solrquery(article);
                //将数据返回到前端
		return ArtList;
	}


2、solr部分

//执行查询操作
	public List<Article> solrquery(Article article)throws Exception{
		
        SolrServer solrServer = new HttpSolrServer("@localhost:8080/solr/collection");
        //创建一个文档对象SolrInputDocument         
        SolrInputDocument document = new SolrInputDocument();
        //向文档中添加域,必须有id域,域的名称必须在scheme.xml中定义
        SolrQuery solrQuery = new SolrQuery(); //构造搜索条件
      //开启分词的方式:""+ article.getKeywords()+"",不开启:"\""+ article.getKeywords()+"\""
        solrQuery.setQuery("keywords:" +""+ article.getKeywords()+""); //搜索关键词
        //开始查询的位置
        solrQuery.setStart(article.getStartPage());
        //查询的条数,这里是查询10条数据
        solrQuery.setRows(10);
        solrQuery.setHighlight(true); // 开启高亮组件
        solrQuery.addHighlightField("*");// 高亮字段
        solrQuery.setHighlightSimplePre("<em>");// 标记,高亮关键字前缀
        solrQuery.setHighlightSimplePost("</em>");// 后缀
        // 执行查询
        QueryResponse queryResponse = solrServer.query(solrQuery);        
        SolrDocumentList list=queryResponse.getResults();
        //获取article文章实体类查询结果list
      List<Article> articlelist=queryResponse.getBeans(Article.class);
    //获取高亮
      Map<String, Map<String, List<String>>> highlightresult = queryResponse.getHighlighting();
      //在对查询到的结果进行遍历时,对是否存在高亮进行判断,如果存在,则进行实体类中属性值的替换。
      for(int i=0;i<articlelist.size();i++){
    	  //获取文章id
    	  int article_id=articlelist.get(i).getAid();
          //标题高亮
            if (highlightresult.get(""+article_id+"") != null && highlightresult.get(""+article_id+"").get("head") != null) {
                articlelist.get(i).setHead(highlightresult.get(""+article_id+"").get("head").get(0));
            }
          //简介高亮
            if (highlightresult.get(""+article_id+"") != null && highlightresult.get(""+article_id+"").get("content") != null) {
                articlelist.get(i).setContent(highlightresult.get(""+article_id+"").get("content").get(0));
            }
            }

		return articlelist;
		
		
	}


这样就实现了solr的推荐文章的功能,我只是大致说了下思路,具体优化什么的还需要自己摸索

10人已赞


本文由Fun言网 – 小东Freeman创作,转载请务必附上本文链接和出处,欢迎参与我们的付费投稿计划


你还没有登录,请先 登录注册!
文章评论1