Solr结合Auto Complete实现自动提示

前言

在日常经常使用的搜索中,我们经常会看到下面这种页面。这种智能提示,会向用户友好的推荐可能用户想查询的关键词。

Solr结合Auto Complete实现自动提示_第1张图片

不管是solr还是ES,实现上面这种效果的方式有很多,这里主要是结合solr和jquery中的Autocomplete来实现上面的效果。

Solr中的智能提示配置

首先需要说明,这里使用的solr版本是5.5.5,其他版本可能有些许差别。但是基本原理应该是差不多的。对于solr服务的搭建,索引的生成,IK分词器的配置,数据批量定时生成索引,这里不做详细介绍,有兴趣的自行百度。这里主要讲解solr搭建好之后,如何配置实现Suggest功能。(其实Suggest功能和spellcheck是相辅相成的)。

首先在solrConfig.xml文件中配置searchComponent和requestHandle

  
  
        text_general
        
            suggest
            org.apache.solr.spelling.suggest.Suggester
            org.apache.solr.spelling.suggest.tst.TSTLookup
            suggestion
            
            0.0001
            spellchecker
            freq
            true
            
        
    
    
        
            true
            suggest
            true
            false
            10
            true
        
        
            suggest
        
    

然后再managed-schema文件中配置需要智能提示或者不全的域信息





  
  
  

上面中mc,sfzhm,xm是之前就已经定义好的域,我们这里是需要对这三个域进行智能提示,所以将这三个域整合到新建的suggestion的域中。(注意:这里的suggestion要和solrConfig.xml文件中配置searchComponent的域要保持一致)同时这里新增了一个text_spell域类型。其实也是可以用text_general,text_IK,具体结合自己的使用项目需求。

在配置好上面的配置之后,我们需要重新生成索引,把之前的索引删除掉,重新生成。我们在solr的管理界面上删除之前的索引

Solr结合Auto Complete实现自动提示_第2张图片

点击commit之后就ok了,确认之前的旧索引删除掉之后,我们重新按照新的配置文件,生成新的索引。然后在solr控制台中测试solr的自动提示效果

Solr结合Auto Complete实现自动提示_第3张图片

至此,solr本身的自动提示功能已经实现。

结合Autocomplete使用

上面solr的智能提示已经完成,但是这是在solr控制台中的效果,像百度那样的实际效果是怎么实现的呢?其实这需要借助jquery的autocomplete插件来实现

相关js和css文件,具体资源可以去网上下载   https://jqueryui.com/download/



页面主要js脚本如下

      $(function(){
        $("#searchText").autocomplete({
        	  source: function(request, response) {
                      var paravar=request.term;
        	      $.ajax({
        	      url: "<%=basePath%>solrController/suggest",
        	      dataType: "json",
        	      data: {
        	    	word:paravar
        	      },
        	      success: function(data) {
        	    	   var result=new Array();
        	    	   $.each(data,function(index,para){
        	    		   result.push(para.suggestion);
        	    	   });
        	    	   response($.map(result, function(item) {
        	              return {
        	                label: item,
        	                value: item
        	              }
        	            }));
        	      }
        	    });
        	  },
        	  minLength: 2
        	});
      }); 

对于solrController/suggest,我们是在后台用solrj来发生suggest请求,具体代码如下

        /**
	 * solr中的suggest智能补全功能
	 * @param word
	 * @return
	 */
	@ResponseBody
	@RequestMapping("/suggest")
	public  List> suggest(String word) {
		List> wordList = new 
        ArrayList>();
		try {
			SolrQuery query = new SolrQuery();
			query.set("q",  word);// 查询的词
			query.set("qt", "/suggest");// 请求到suggest中
			query.set("spellcheck.count", "10");// 返回数量
			QueryResponse rsp = httpSolrServer.query(query);
			// 上面取结果的代码
			SpellCheckResponse re = rsp.getSpellCheckResponse();
			// 获取拼写检查的结果集
			if (re != null) {
			for (Suggestion s : re.getSuggestions()) {
				List list = s.getAlternatives();
				// 获取所有 的检索词
				for (String spellWord : list) {
					Map map = new 
							HashMap();
					map.put("suggestion", spellWord);
					wordList.add(map);
				}
			}
			}
		} catch (Exception e) {
			e.printStackTrace();
		}
		return wordList;
	}

具体效果

Solr结合Auto Complete实现自动提示_第4张图片

总结

上面只是简单的介绍了solr自动提示的配置,以及怎么和autocomplete整合的小栗子!对于solr的其他功能,以及现在比较火的ES,后续在和大家一起学习!

你可能感兴趣的:(Lucene,Solr)