博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
solr检索建议的功能
阅读量:4186 次
发布时间:2019-05-26

本文共 4773 字,大约阅读时间需要 15 分钟。

比较详细的介绍了拼写检查的功能,本篇笔者就来说一下检索建议的功能,可能好多才学的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>  
string
suggest
org.apache.solr.spelling.suggest.Suggester
org.apache.solr.spelling.suggest.tst.TSTLookup
my_word
0.0001
freq
true
true
true
suggest
10
true
false
true
suggest

至此,我们就可以启动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
suggest(String word)throws Exception{ List
wordList=new ArrayList
(); 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
list=s.getAlternatives();//获取所有 的检索词 for(String spellWord:list){ System.out.println(spellWord); wordList.add(spellWord); } return wordList;//建议词汇 } // List
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事件,就可以实现类似百度输入框的功能了。

转载地址:http://aajoi.baihongyu.com/

你可能感兴趣的文章
程序员面试中最容易碰到的五个套路!应届生最容易上当
查看>>
三种不同的程序员,你属于哪一种?如果要裁员,你会让谁走?
查看>>
干货神总结,程序员面试技巧
查看>>
深度解析BAT三家互联网公司,为什么腾讯产品第一,百度技术第一,阿里运营第一?
查看>>
程序员发贴求助:剪短头发能缓解脱发吗?网友:我觉得秃头挺好的
查看>>
史上最难程序员的面试题!谷歌、百度、微软、阿里必答题
查看>>
为什么会出现“程序员千万不要学算法”这种言论?
查看>>
程序员如何做到快速升职?这几点你都做到了吗?
查看>>
第五届世界互联网大会重点介绍工业互联网
查看>>
凭什么程序员工资那么高?网友:某些文职坐着白领钱才让我惊奇
查看>>
程序员准时下班碰见领导,次月发工资时看到绩效莫名被扣20%
查看>>
你见过最牛逼的程序员是什么样的?拳打回车键,脚踩Emacs编辑器
查看>>
相比加班的程序员,企业更喜欢“偷懒”的程序员?程序员偷的不是懒,是高效!
查看>>
初学Java必备基础知识,编程领域你需要掌握的关键点!
查看>>
阿里五年Java程序员的总结,献给还在迷茫中的你!
查看>>
程序员身上有异味,同事为什么都不会直接告诉他?
查看>>
大数据折射算法“歧视”?王思聪微博抽奖113位,仅有一位男性
查看>>
Java、C、C+ +、PHP、Python分别用来开发什么?一篇文章告诉你!
查看>>
Linux-SHELL常用命令
查看>>
Linux-网络运维基础
查看>>