zoukankan      html  css  js  c++  java
  • Solr4.3之检索建议suggest

    原文链接:http://www.656463.com/article/Efm26v.htm

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

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

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

    F: omcatwebappssolrsolr_homecollectionscollection1confsuggest.txt  

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

    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> 

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

    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.        return null;

    34.    } 

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

  • 相关阅读:
    八数码难题 (codevs 1225)题解
    小木棍 (codevs 3498)题解
    sliding windows (poj 2823) 题解
    集合删数 (vijos 1545) 题解
    合并果子 (codevs 1063) 题解
    等价表达式 (codevs 1107)题解
    生理周期 (poj 1006) 题解
    区间 (vijos 1439) 题解
    区间覆盖问题 题解
    种树 (codevs 1653) 题解
  • 原文地址:https://www.cnblogs.com/jingblogs/p/4342344.html
Copyright © 2011-2022 走看看