solr检索建议的功能

比较详细的介绍了拼写检查的功能,本篇笔者就来说一下检索建议的功能,可能好多才学的solr的人,都容易把二者搞混,误以为他们是同一个东西,其实不然,他们的侧重点,还是不同的,拼写检查就是用来检查用户输入的检索内容是否存在,如果不存在则,给它提示出相近,或相似的内容,而检索建议则是用户输入某个检索条件后,会立刻友好的给出一系列提示内容,并推荐首个出现的相似的词,作为推荐词。如果这个条件想关的东西一个都没有,则不会提示,所以某种意义上来说,可以在用户输入检索条件时使用suggest,而在点击完搜索时,使用拼写检查,二者结合给可以用户带来比较好的用户体验!


检索建议(suggest)是依附于拼写检查组件实现的功能,所以呢SpellCheck这个组件很重要,拼写检查可以作为一个功能,单独使用,但是suggest功能就不可以,必须的在拼写检查组件存在的时候可以用,否则再启动tomcat时,会报一个未知的SpellCheck组件异常。

下面开始进入正题,suggest的配置相对简单,主要也是由两种形式,第一种只能用主索引库里面存在的建议词,作为提示。第二种使用自定义的建议词库作为建议词,自定义的建议词文本,放在跟solrconfig.xml同一级目录下即可


Java代码 复制代码  收藏代码
  1. F:\tomcat\webapps\solr\solr_home\collections\collection1\conf\suggest.txt   
F:\tomcat\webapps\solr\solr_home\collections\collection1\conf\suggest.txt 



下面给出suggest在solrconfig.xml里配置的代码

Java代码 复制代码  收藏代码
  1. <searchComponent name="suggest" class="solr.SpellCheckComponent">    
  2.    <str name="queryAnalyzerFieldType">string</str>    
  3.    <lst name="spellchecker">      
  4.        <str name="name">suggest</str>      
  5.        <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>      
  6.        <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>      
  7.        <str name="field">my_word</str>    
  8.        <float name="threshold">0.0001</float>   
  9.        <!-- 使用自定义suggest词库词可以将如下两行的注释取消    
  10.        <str name="sourceLocation">suggest.txt</str>   
  11.        <str name="spellcheckIndexDir">spellchecker</str>  
  12.     -->    
  13.        <str name="comparatorClass">freq</str>    
  14.        <str name="buildOnOptimize">true</str>    
  15.        <str name="buildOnCommit">true</str>         
  16.    </lst>      
  17.  </searchComponent>        
  18.     
  19.  <requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler">      
  20.    <lst name="defaults">      
  21.        <str name="spellcheck">true</str>      
  22.        <str name="spellcheck.dictionary">suggest</str>      
  23.        <str name="spellcheck.count">10</str>      
  24.        <str name="spellcheck.onlyMorePopular">true</str>    
  25.        <str name="spellcheck.extendedResults">false</str>          
  26.        <str name="spellcheck.collate">true</str>    
  27.        <!--<str name="spellcheck.build">true</str>  -->      
  28.    </lst>      
  29.    <arr name="components">      
  30.        <str>suggest</str>      
  31.    </arr>      
  32.  </requestHandler>  
 <searchComponent name="suggest" class="solr.SpellCheckComponent">  
    <str name="queryAnalyzerFieldType">string</str>  
    <lst name="spellchecker">    
        <str name="name">suggest</str>    
        <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>    
        <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>    
        <str name="field">my_word</str>  
        <float name="threshold">0.0001</float> 
        <!-- 使用自定义suggest词库词可以将如下两行的注释取消 	
        <str name="sourceLocation">suggest.txt</str> 
        <str name="spellcheckIndexDir">spellchecker</str>
		-->	
        <str name="comparatorClass">freq</str>  
        <str name="buildOnOptimize">true</str>  
        <str name="buildOnCommit">true</str>       
    </lst>    
  </searchComponent>      
   
  <requestHandler name="/suggest" class="org.apache.solr.handler.component.SearchHandler">    
    <lst name="defaults">    
        <str name="spellcheck">true</str>    
        <str name="spellcheck.dictionary">suggest</str>    
        <str name="spellcheck.count">10</str>    
        <str name="spellcheck.onlyMorePopular">true</str>  
        <str name="spellcheck.extendedResults">false</str>        
        <str name="spellcheck.collate">true</str>  
        <!--<str name="spellcheck.build">true</str>  -->    
    </lst>    
    <arr name="components">    
        <str>suggest</str>    
    </arr>    
  </requestHandler>



至此,我们就可以启动solr服务,在UI页面使用/suggest请求,进行测试,下面给出solrj的代码

Java代码 复制代码  收藏代码
  1.  public List<String> suggest(String word)throws Exception{  
  2.           
  3.         List<String>  wordList=new ArrayList<String>();  
  4.         SolrQuery query = new SolrQuery();  
  5.         query.set("q""my_word:"+word);//查询的词  
  6.         query.set("qt""/suggest");//请求到suggest中  
  7.         query.set("spellcheck.count""10");//返回数量  
  8.         QueryResponse   rsp = server.query(query);  
  9.       //  System.out.println("直接命中:"+rsp.getResults().size());                 
  10.         //…上面取结果的代码  
  11.         SpellCheckResponse re=rsp.getSpellCheckResponse();//获取拼写检查的结果集  
  12.           
  13.         if (re != null) {  
  14.             for(Suggestion s:re.getSuggestions()){  
  15.              List<String> list=s.getAlternatives();//获取所有 的检索词  
  16.              for(String spellWord:list){  
  17.                  System.out.println(spellWord);  
  18.                  wordList.add(spellWord);  
  19.              }  
  20.                
  21.              return wordList;//建议词汇  
  22.             }  
  23.               
  24.               
  25.         // List<Collation> list=re.getCollatedResults();//  
  26.            String t=re.getFirstSuggestion(word);//获取第一个推荐词  
  27.            System.out.println("推荐词:"+t);  
  28. //       for(Collation c:list){  
  29. //             
  30. //           System.out.println("推荐词:"+c.getCollationQueryString());  
  31. //       }  
  32.            
  33.         }  
  34.           
  35.         return null;  
  36.           
  37.     }  
 public List<String> suggest(String word)throws Exception{
		
		List<String>  wordList=new ArrayList<String>();
		SolrQuery query = new SolrQuery();
		query.set("q", "my_word:"+word);//查询的词
		query.set("qt", "/suggest");//请求到suggest中
		query.set("spellcheck.count", "10");//返回数量
		QueryResponse	rsp = server.query(query);
	  //  System.out.println("直接命中:"+rsp.getResults().size());             	 
		//…上面取结果的代码
	    SpellCheckResponse re=rsp.getSpellCheckResponse();//获取拼写检查的结果集
		
		if (re != null) {
		    for(Suggestion s:re.getSuggestions()){
		     List<String> list=s.getAlternatives();//获取所有 的检索词
		     for(String spellWord:list){
		    	 System.out.println(spellWord);
		    	 wordList.add(spellWord);
		     }
		     
		     return wordList;//建议词汇
		    }
		    
		    
		// List<Collation> list=re.getCollatedResults();//
		   String t=re.getFirstSuggestion(word);//获取第一个推荐词
		   System.out.println("推荐词:"+t);
//		 for(Collation c:list){
//			 
//			 System.out.println("推荐词:"+c.getCollationQueryString());
//		 }
		 
		}
		
		return null;
		
	}




最后,我们就在 WEB项目中,使用ajax+suggest+keyup事件,就可以实现类似百度输入框的功能了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值