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事件,就可以实现类似百度输入框的功能了

  • 相关阅读:
    .net WebApi中使用swagger
    HTTP Error 503. The service is unavailable
    python3消费rocketmq
    docker安装部署showdoc
    EasyMock.replay()有什么用
    java.lang.IllegalStateException: 1 matchers expected, 5 recorded.
    io.spring.platform继承方式和import方式更改依赖版本号的问题
    spring-boot-dependencies、spring-boot-starter-parent、io.spring.platform详解
    springboot依赖的一些配置:spring-boot-dependencies、spring-boot-starter-parent、io.spring.platform
    一个最简单的springboot
  • 原文地址:https://www.cnblogs.com/jingblogs/p/4342344.html
Copyright © 2011-2022 走看看