首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网站开发 > Web前端 >

solr4.3之拼写检查SpellChecker效能

2013-11-23 
solr4.3之拼写检查SpellChecker功能拼写检查功能,能在搜索时,提供一个较好用户体验,所以,主流的搜索引擎都

solr4.3之拼写检查SpellChecker功能
拼写检查功能,能在搜索时,提供一个较好用户体验,所以,主流的搜索引擎都有这个功能。在这之前,笔者先简单的说一下什么是拼写检查,其实很好理解,就是你输入的搜索词,可能是你输错了,也有可能在它的检索库里面根本不存在这个词,但是这时候它能给你返回,相似或相近的结果来帮助你校正。

举个例子,假如你在百度里面输入在在线电瓶,可能它的索引库里面就没有,但是它有可能返回在线电影,在线电视,在线观看等等一些词,这些,就用到拼写检查的功能了。

solr作为一种开源的搜索服务器,对拼写检查,也提供了良好的支持,那么下面笔者就来讲下关于solr4.3的拼写检查的配置,在这之前先说明一点,作为拼写检查用,为了提高校正的准确率,一般对校正的词,不要进行分词,所以用string就好了,拼写检查的配置主要是在solrconfig.xml里面配置.



1,拼写组件SpellCheckComponent配置
2,在SearchHandler   /select里面配置
3,在SearchHandler   /spell里面配置

按照上面3来,就可以快速配置好拼写检查功能了,其实笔者上面写的4步,其实只配置2,3步就可以了,另外的第4步用默认值就可以了,在这里把它写出来,只是让大家有个认识


拼写组件SpellCheckComponent它其实是核心的东西,在他的里面可以配置1至多个拼写检查器,启动的时候所有的检查器都会加载,这次笔者主要介绍的有2个拼写检查器,一个是默认的只对主索引做拼写校正,另外一个是自定义加载spellings.txt拼写检查库,带拼写校正索引库的检查器,其他的检查器各位道友想要使用的话就自己去看wiki了。

Java代码 
<searchComponent name="spellcheck" startup="lazy"> 
    <lst name="defaults"> 
      <str name="df">text</str> 
      <str name="spellcheck.dictionary">direct</str> 
      <str name="spellcheck">on</str> 
      <str name="spellcheck.extendedResults">true</str>             
      <str name="spellcheck.collate">true</str> 
      <str name="spellcheck.collateExtendedResults">true</str>        
    </lst> 
    <arr name="last-components"> 
      <str>spellcheck</str> 
    </arr> 
  </requestHandler> 


至此,拼写检查功能已经配置完毕,可以用solr的UI页面进行主索引测试,也可以用spellCheckFile里面的副索引,测试,但是,一次只能使用一种校正方法
下面给出solrj代码
Java代码 
    public  List<String>   spellcheck(String word){ 
        List<String>  wordList=new ArrayList<String>(); 
        SolrQuery query = new SolrQuery(); 
        //query.set("q","name:ac"); 
        //query.set("qt", "/spell"); 
     //默认是主索引 
        query.set("q", "my_word:"+word+"");   
        query.set("qt", "/select"); 
        //query.set("spellcheck.build", "true");//遇到新的检查词,会自动添加到索引里面 
        //query.set("spellcheck.dictionary", "file");//使用副索引,checkSpellFile里面的进行使用 
        query.set("spellcheck", "true"); 
        query.set("spellcheck.count", Integer.MAX_VALUE); 
          //  params.set("spellcheck.build", "true"); 
          
        try { 
        QueryResponse   rsp = server.query(query); 
        System.out.println("直接命中:"+rsp.getResults().size());              
        SolrDocumentList ss=rsp.getResults(); 
        for(SolrDocument doc:ss){ 
            System.out.println(doc.get("my_word")); 
        } 
        //…上面取结果的代码 
        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); 
             } 
            } 
//        for(Collation s: spellCheckResponse.getCollatedResults()){ 
//            System.out.println(s.toString()); 
//        } 
        } 
 
          return wordList; 
        } catch (SolrServerException e) { 
            // TODO Auto-generated catch block 
            e.printStackTrace(); 
        } 
         
        return null; 
    } 




最后,笔者关于拼写检查还有一个问题没有搞清楚,就是使用spellings.txt里面的自定义词,检索时只能检索出长度大于2的词,希望各位看到此篇文章的读者也测试一下,找一下解决方法。


http://qindongliang1922.iteye.com/blog/1900192

热点排行