输入联想、搜索智能提示(Solr Suggest实现)

功能说明

  • 输入联想(搜索智能提示)是一个提高用户体验度的功能,用户在使用检索功能时输入一个字母或者汉字时系统会自动给用户推荐相关词汇。此功能减少了用户输入时的敲击次数,同时加快了输入速度,还可以给用户提供更多的检索选择。
  • Solr是一个高集成、独立的企业级检索服务器。Solr配置简单而且性能强大。本文使用了Solr自带的Suggest组件来实现输入联想。Suggest是在Solr4之后才加入的,所以低于4的无法使用。本文使用的版本是4.3。
    输入联想、搜索智能提示(Solr Suggest实现)_第1张图片

项目配置

  • 在此默认已经配置好了solr环境。在solrhome下的solrcong.xml文件中加入如下配置:
      
    string  
 
        
      suggest      
      org.apache.solr.spelling.suggest.Suggester      
      org.apache.solr.spelling.suggest.tst.TSTLookup   
      GOODSNAME    
      0.0001   
      suggest.txt    
      spellchecker  
      freq    
      true    
      true         
        
     

      
        
      true      
      suggest      
      11      
      true    
      false          
      true    
            
        
        
      suggest      
        
  

配置名称解释:

  • queryAnalyzerFieldType : schema.xml中的fieldType类型,如果加了这个选项,拼写检查时会调用这个fieldType的分词器,如果没有加,solr会取field属性上面filetype的分词器,这个时候还找不到,solr会创建一个按空格进行分词(SpellCheckComponent需要一个分词器才能运行),在这们项目中,我们现希望Analyzer不对查询做任何的改变,因此选择string。(网上也建议不要对他定义复杂的分词,如果指定的Analyzer很复杂的话,会导致suggest返回的结果不符合预期)
  • name:就是取个名字,江湖中的人士都是让他等于suggest
  • classname :org.apache.solr.spelling.suggest.Suggester(不要改动)
  • lookupImpl :org.apache.solr.spelling.suggest.Suggester(不要改动)
  • field : 说明只在这个字段上面做拼写检查
  • threshold :限制一些不常用的词出现,值越大过滤词就越多,取值范围【0~1】官网默认是0.005
  • comparatorClass : ellchecker组件中的comparatorClass参数可配置Suggest返回结果的排序,目前有如下几种可选方案:a .Empty – in which case the default is used. 默认就是这个、b.score – explicitly choose the default case 、c.freq – Sort by frequency first, then score. 通过频率的第一排序,然后得分 (开发时用这个)、d.A fully qualified class name – Provide a custom comparator that implements Comparato
  • buildOnCommit : 取值true或者flase,当commit的时候,对拼写检查索引进行构建。(只有构建后,拼写检查才有效果)
  • buildOnOptimize :当optimize的时候,对拼写检查索引进行构建。(只有构建后,拼写检查才有效果)
  • true : 开启检查建议
  • suggest:必须与searchComponent中spellchecker标签下suggest配置对应
  • 8 :配置拼写检查提示结果的个数(可以根据需要适当加大)
  • true:等于true,可以根据权重排序,开发时我一般让他等于true
  • suggest : handler拥有的 components,first-components,last-components这三个属性的剖,Solr的handler都是同过这三个属性来取他所依赖的components(组件)
  • 备注:handler在运行时,会加载5个默认的组件 ,a如果配置了components,则SOlr不会运行默认的5个组件。 而且你配置的first-components,last-components两个都是无效的。b.如果配置了first-components,SOlr会给handler添加5个默认的组件时,同时会添加first-components配置的组件,而且这个组件最先工作。c.同上,只不过放在最后工作
    名称解释部分摘自solr suggest检查建议

注意* 按照上述配置后需要在solrcong.xml同级目录下放置一个suggest.txt文件。 suggest.txt文件内容必须是utf-8的字符格式,不能用windows的记事本编辑。可以用notepad一类工具编辑转UTF-8。方法如下:

输入联想、搜索智能提示(Solr Suggest实现)_第2张图片

Suggest.txt文本内容即为人工维护的热搜词,示例如下:

输入联想、搜索智能提示(Solr Suggest实现)_第3张图片

配置完成后重启solr服务器,访问solrAdmin。选择对应的库,点击Query、qt输入"/suggest"、q输入"笔"(搜索词)、点击Execute query查看效果。右侧输出框为结果数据。

输入联想、搜索智能提示(Solr Suggest实现)_第4张图片

代码调用

测试无误后即可将这一模块运用到项目中了。实现思想是用户在输入框输入内容后异步访问后天,后台调用solr后封装反回数据传到前台进行展示。java代码如下:

public List searchSuggest(String word) throws SolrServerException {
		SolrQuery params = new SolrQuery();  
        params.set("qt", "/suggest");  
        params.setQuery("GOODSNAME:"+word);//word为搜索词
		QueryResponse queryResponse = getSolrServer(ResourceUtil.getConfigValueByName("solr.url")).query(params);
		SpellCheckResponse suggest = queryResponse.getSpellCheckResponse();    
        List suggestionList = suggest.getSuggestions();    
        List suggestedWordList  = new ArrayList();
        for (Suggestion suggestion : suggestionList) {    
            System.out.println("Suggestions NumFound: " + suggestion.getNumFound());    
            System.out.println("Token: " + suggestion.getToken());    
            suggestedWordList = suggestion.getAlternatives();    
        }   
        System.out.print("Suggested: "+queryResponse);    
		return suggestedWordList;
	}

solr返回的结果如下:
{responseHeader={status=0,QTime=1},spellcheck={suggestions={笔{numFound=5,startOffset=10,endOffset=11,suggestion=[笔袋, 笔芯, 笔记本子, 笔记本电脑, 笔筒]},collation=GOODSNAME:笔袋}}}

  • 后台将‘[笔袋, 笔芯, 笔记本子, 笔记本电脑, 笔筒]’做分割,将结果集合传到前台进行展示即可。

你可能感兴趣的:(Solr)