solr拼寫檢查實例

拼寫檢查功能,能在搜索時,提供一個較好用戶體驗,所以,主流的搜索引擎都有這個功能。在這之前,筆者先簡單的說一下什麼是拼寫檢查,其實很好理解,就是你輸入的搜索詞,可能是你輸錯了,也有可能在它的檢索庫裏面根本不存在這個詞,但是這時候它能給你返回,相似或相近的結果來幫助你校正。 

舉個例子,假如你在百度裏面輸入在在線電瓶,可能它的索引庫裏面就沒有,但是它有可能返回在線電影,在線電視,在線觀看等等一些詞,這些,就用到拼寫檢查的功能了。 

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" class="solr.SpellCheckComponent">  
       
<!-- 查詢分析器,如果不指定的話,默認會使用field字段類型的分詞器 -->  
   <str name="queryAnalyzerFieldType">string</str>  
   <!-- 默認的校正器,只對主索引庫管用 -->  
<lst name="spellchecker">  
     <str name="name">default</str>  
     <str name="field">my_word</str>  
     <str name="classname">solr.DirectSolrSpellChecker</str>   
     <str name="distanceMeasure">internal</str>  
     <float name="accuracy">0.7</float>  
     <int name="maxEdits">1</int>  
     <int name="minPrefix">1</int>  
     <int name="maxInspections">5</int>  
     <int name="minQueryLength">4</int>  
     <float name="maxQueryFrequency">0.01</float>  
   </lst>  
   
<!--  讀取拼寫檢查庫的索引進行校正可以,使用默認配置,取消註釋即可 -->  
<lst name="spellchecker">  
        <str name="classname">solr.FileBasedSpellChecker</str>  
        <str name="name">file</str>  
        <str name="sourceLocation">spellings.txt</str>  
        <str name="characterEncoding">UTF-8</str>  
        <str name="spellcheckIndexDir">spellcheckerFile</str>  
      </lst>  
</searchComponent>  

對於上面的代碼,雖然可以加載多個校正器,但是在拼寫檢查時,只能指定特定的一個進行校正,那麼爲什麼要配置多個校正檢查器呢? 筆者個人感覺這個主要是方便在程序運行可以動態切換校正器。 

在spellings.txt裏面自定義的拼寫檢查詞,注意編碼的格式一定是要UTF-8無BOM的格式,這裏面的詞,會在solr服務啓動時,自動創建spellcheckerFile文件夾並把內容加載到 
Java代碼  
F:\eclipse10tomcat\webapps\solr\solr_home\collections\collection1\data\spellcheckerFile  
索引起來。 

SearchHandler   /select這個檢索請求裏面的配置很重要,拼寫檢查是否啓用就是在這裏面配置, 
Java代碼  
<requestHandler name="/select" class="solr.SearchHandler">  
   <!-- default values for query parameters can be specified, these  
        will be overridden by parameters in the request  
     -->  
    <lst name="defaults">  
      <str name="echoParams">explicit</str>  
      <int name="rows">10</int>  
      <str name="df">text</str>  
    </lst>  
<!-- 這行代碼非常重要,如果沒有這行,拼寫檢查,是不起作用的-->  
  <arr name="last-components">  
        <str>spellcheck</str>  
      </arr>  
   </requestHandler>  



SearchHandler   /spell組件使用默認配置即可 
Java代碼  
<requestHandler name="/spell" class="solr.SearchHandler" 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;  
    }  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章