suggest 输入拼音提示中文1.0.0

转载请注明出处:http://lucien-zzy.iteye.com/admin/blogs/2008291

在完成solr的搭建后(solr搭建可以参考这篇:http://lucien-zzy.iteye.com/blog/2002087)

我们来看看如何实现suggest输入拼音提示中文的功能:

这里我是基于http://lucien-zzy.iteye.com/blog/2002087 这篇来搭建的。

第一步:将这俩jar包放入 F:\winsolr\solr_home\solr\collection1\contrib\extraction\lib 中



 jar包见附件

第二步:配置 solrconfig.xml 文件,添加以下内容

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
     <str name="queryAnalyzerFieldType">text_spell</str> 
     <lst name="spellchecker"> 

           <str name="name">default</str>  
           <!--这里指明需要根据哪个字段的索引为依据进行拼写检查。现配置 名为 name 的字段-->  
           <str name="field">text</str>  
           <!--拼写检查索引的目录-->  
           <str name="spellcheckIndexDir">spellchecker</str>  
           <!--当commit的时候,对拼写检查索引进行构建。(只有构建后,拼写检查才有效果)-->  
           <!--当然,也可以选择在optimize的时候,进行构建。那么只需要将"buildOnCommint"换为 "buildOnOptimize"-->  
           <str name="buildOnCommit">true</str> 

         <str name="classname">solr.FileBasedSpellChecker</str>
         <str name="sourceLocation">spellings.txt</str>
         <str name="characterEncoding">UTF-8</str>
        
<!--
       <str name="name">direct</str> 
       <str name="field">text</str> 
       <str name="classname">solr.DirectSolrSpellChecker</str> 
       <str name="distanceMeasure">internal</str> 
       <float name="accuracy">0.5</float> 
       <int name="maxEdits">2</int> 
       <int name="minPrefix">1</int> 
       <int name="maxInspections">5</int> 
       <int name="minQueryLength">2</int> 
       <float name="maxQueryFrequency">0.01</float> 
-->
</lst> 
  </searchComponent> 

  <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy"> 

      <!--默认参数-->  
  <lst name="defaults">  
    <str name="spellcheck.onlyMorePopular">true</str>  
    <str name="spellcheck.extendedResults">false</str>  
    <!--配置拼写检查提示结果的个数(可以根据需要适当加大)-->  
    <str name="spellcheck.count">3</str>  
  </lst>  
  <arr name="last-components">  
    <str>spellcheck</str>  
  </arr>  
<!--
     <lst name="defaults"> 
         <str name="spellcheck.dictionary">direct</str> 
          <str name="spellcheck">on</str>  
	<str name="spellcheck.collate">true</str> 
         <str name="spellcheck.collateExtendedResults">true</str>   
     </lst> 
     <arr name="last-components"> 
       <str>spellcheck</str> 
     </arr> 
-->
   </requestHandler>


  <searchComponent  name="suggest" class="solr.SpellCheckComponent">
    <str name="queryAnalyzerFieldType">string</str>
    <lst name="spellchecker">
        <str name="name">suggest</str>
        <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
        <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
        <str name="field">text</str>
        <float name="threshold">0.0001</float>
        <str name="spellcheckIndexDir">spellchecker</str>
        <str name="comparatorClass">freq</str>
        <str name="buildOnOptimize">true</str>
        <!--<str name="buildOnCommit">true</str>-->
    </lst>
	
	<!--用于输入拼音提示功能-->
	<lst name="spellchecker">
        <str name="name">pysuggest</str>
        <str name="classname">shentong.tsearch.spelling.suggest.Suggester</str>
        <str name="lookupImpl">shentong.tsearch.spelling.suggest.py.PYLookup</str>
        <str name="field">text</str>
        <float name="threshold">0.0001</float> 
	<str name="pySuggestIndexDir">suggestIndex</str>
        <str name="comparatorClass">freq</str>
        <str name="buildOnOptimize">true</str>
        <!--<str name="buildOnCommit">true</str>-->
    </lst>
</searchComponent>
<requestHandler  name="/suggest" class="solr.SearchHandler" startup="lazy">
    <lst name="defaults">
        <str name="spellcheck">true</str>
        <str name="spellcheck.dictionary">suggest</str>
        <!-- 这个参数告诉solr,当查询的结果数多于设定的count数时,返回点击数更多的那些 -->
        <str name="spellcheck.onlyMorePopular">true</str>
        <str name="spellcheck.extendedResults">false</str>
        <str name="spellcheck.count">10</str>
        <str name="spellcheck.collate">true</str>
    </lst>
    <arr name="components">
        <str>suggest</str>
    </arr>
 </requestHandler>

 第三步:增加索引

 第四步:结合Ajax 实现suggest(这里只贴出主要的solrj查询代码)

JSONObject json = new JSONObject();
		 //获取请求的实际URL相对于请求的serlvet的url的路径。
         String requesturl = request.getPathInfo();
          //检索建议
		  if(requesturl.indexOf("/suggest") != -1){
			  String data = request.getParameter("data");
			  if(!StringUtil.empty(data)){
				 
				  String url = ConfigUtil.getStringValue("solr_url");
				  SolrjTool solr = SolrjTool.getinstence();
				  solr.init(url);
				  //创建查询对象
				  SolrQuery query = new SolrQuery();
				  query.set("q", data);  //set查询关键词
				  query.set("qt", "/suggest"); //set查询类型为 suggest
				  query.set("spellcheck.count", "10"); //set 查询出的总条数
				  query.set("spellcheck.dictionary", "pysuggest"); 
				  query.set("spellcheck", "on");  
				  query.set("spellcheck.build", "true"); 
				  //执行查询
				  QueryResponse res = solr.execseQuery(query);  	
				  SpellCheckResponse spellCheckResponse = res.getSpellCheckResponse();
				  if (spellCheckResponse != null) {
					   //获取Suggestion集合
					   List<Suggestion> suggestionList = spellCheckResponse.getSuggestions();
					   List<String> suggestedList = new ArrayList<String>();  
					   for (Suggestion suggestion : suggestionList) {
						 //获取索引库集合
					     List<String> suggestedWordList = suggestion.getAlternatives();
					     
					    for (int i = 0; i < suggestedWordList.size(); i++) {
					       String word = suggestedWordList.get(i);
					       
					       suggestedList.add(word);
 
					    }
					     
					   }
					   if(suggestedList.size() >0 ){
				
							  json.put("code", "1");
							  json.put("data", suggestedList);
					   }else{
						   //没有结果
							  json.put("code", "1001"); 
					   }
					    
				  }else{
					  //没有结果
					  json.put("code", "1001"); 
				  }
 
			  }else{
				 //没有检索项 
				json.put("code", "1000");
				  
			  }
			  out.println(json.toString()); 
		  
		  }

 第五步:访问页面查询测试,如图:



 

 

 

转载请注明出处:http://lucien-zzy.iteye.com/admin/blogs/2008291

转载请注明出处:http://lucien-zzy.iteye.com/admin/blogs/2008291

在完成solr的搭建后(solr搭建可以参考这篇:http://lucien-zzy.iteye.com/blog/2002087)

我们来看看如何实现suggest输入拼音提示中文的功能:

这里我是基于http://lucien-zzy.iteye.com/blog/2002087 这篇来搭建的。

第一步:将这俩jar包放入 F:\winsolr\solr_home\solr\collection1\contrib\extraction\lib 中



 jar包见附件

第二步:配置 solrconfig.xml 文件,添加以下内容

<searchComponent name="spellcheck" class="solr.SpellCheckComponent">
     <str name="queryAnalyzerFieldType">text_spell</str> 
     <lst name="spellchecker"> 

           <str name="name">default</str>  
           <!--这里指明需要根据哪个字段的索引为依据进行拼写检查。现配置 名为 name 的字段-->  
           <str name="field">text</str>  
           <!--拼写检查索引的目录-->  
           <str name="spellcheckIndexDir">spellchecker</str>  
           <!--当commit的时候,对拼写检查索引进行构建。(只有构建后,拼写检查才有效果)-->  
           <!--当然,也可以选择在optimize的时候,进行构建。那么只需要将"buildOnCommint"换为 "buildOnOptimize"-->  
           <str name="buildOnCommit">true</str> 

         <str name="classname">solr.FileBasedSpellChecker</str>
         <str name="sourceLocation">spellings.txt</str>
         <str name="characterEncoding">UTF-8</str>
        
<!--
       <str name="name">direct</str> 
       <str name="field">text</str> 
       <str name="classname">solr.DirectSolrSpellChecker</str> 
       <str name="distanceMeasure">internal</str> 
       <float name="accuracy">0.5</float> 
       <int name="maxEdits">2</int> 
       <int name="minPrefix">1</int> 
       <int name="maxInspections">5</int> 
       <int name="minQueryLength">2</int> 
       <float name="maxQueryFrequency">0.01</float> 
-->
</lst> 
  </searchComponent> 

  <requestHandler name="/spell" class="solr.SearchHandler" startup="lazy"> 

      <!--默认参数-->  
  <lst name="defaults">  
    <str name="spellcheck.onlyMorePopular">true</str>  
    <str name="spellcheck.extendedResults">false</str>  
    <!--配置拼写检查提示结果的个数(可以根据需要适当加大)-->  
    <str name="spellcheck.count">3</str>  
  </lst>  
  <arr name="last-components">  
    <str>spellcheck</str>  
  </arr>  
<!--
     <lst name="defaults"> 
         <str name="spellcheck.dictionary">direct</str> 
          <str name="spellcheck">on</str>  
	<str name="spellcheck.collate">true</str> 
         <str name="spellcheck.collateExtendedResults">true</str>   
     </lst> 
     <arr name="last-components"> 
       <str>spellcheck</str> 
     </arr> 
-->
   </requestHandler>


  <searchComponent  name="suggest" class="solr.SpellCheckComponent">
    <str name="queryAnalyzerFieldType">string</str>
    <lst name="spellchecker">
        <str name="name">suggest</str>
        <str name="classname">org.apache.solr.spelling.suggest.Suggester</str>
        <str name="lookupImpl">org.apache.solr.spelling.suggest.tst.TSTLookup</str>
        <str name="field">text</str>
        <float name="threshold">0.0001</float>
        <str name="spellcheckIndexDir">spellchecker</str>
        <str name="comparatorClass">freq</str>
        <str name="buildOnOptimize">true</str>
        <!--<str name="buildOnCommit">true</str>-->
    </lst>
	
	<!--用于输入拼音提示功能-->
	<lst name="spellchecker">
        <str name="name">pysuggest</str>
        <str name="classname">shentong.tsearch.spelling.suggest.Suggester</str>
        <str name="lookupImpl">shentong.tsearch.spelling.suggest.py.PYLookup</str>
        <str name="field">text</str>
        <float name="threshold">0.0001</float> 
	<str name="pySuggestIndexDir">suggestIndex</str>
        <str name="comparatorClass">freq</str>
        <str name="buildOnOptimize">true</str>
        <!--<str name="buildOnCommit">true</str>-->
    </lst>
</searchComponent>
<requestHandler  name="/suggest" class="solr.SearchHandler" startup="lazy">
    <lst name="defaults">
        <str name="spellcheck">true</str>
        <str name="spellcheck.dictionary">suggest</str>
        <!-- 这个参数告诉solr,当查询的结果数多于设定的count数时,返回点击数更多的那些 -->
        <str name="spellcheck.onlyMorePopular">true</str>
        <str name="spellcheck.extendedResults">false</str>
        <str name="spellcheck.count">10</str>
        <str name="spellcheck.collate">true</str>
    </lst>
    <arr name="components">
        <str>suggest</str>
    </arr>
 </requestHandler>

 第三步:增加索引

 第四步:结合Ajax 实现suggest(这里只贴出主要的solrj查询代码)

JSONObject json = new JSONObject();
		 //获取请求的实际URL相对于请求的serlvet的url的路径。
         String requesturl = request.getPathInfo();
          //检索建议
		  if(requesturl.indexOf("/suggest") != -1){
			  String data = request.getParameter("data");
			  if(!StringUtil.empty(data)){
				 
				  String url = ConfigUtil.getStringValue("solr_url");
				  SolrjTool solr = SolrjTool.getinstence();
				  solr.init(url);
				  //创建查询对象
				  SolrQuery query = new SolrQuery();
				  query.set("q", data);  //set查询关键词
				  query.set("qt", "/suggest"); //set查询类型为 suggest
				  query.set("spellcheck.count", "10"); //set 查询出的总条数
				  query.set("spellcheck.dictionary", "pysuggest"); 
				  query.set("spellcheck", "on");  
				  query.set("spellcheck.build", "true"); 
				  //执行查询
				  QueryResponse res = solr.execseQuery(query);  	
				  SpellCheckResponse spellCheckResponse = res.getSpellCheckResponse();
				  if (spellCheckResponse != null) {
					   //获取Suggestion集合
					   List<Suggestion> suggestionList = spellCheckResponse.getSuggestions();
					   List<String> suggestedList = new ArrayList<String>();  
					   for (Suggestion suggestion : suggestionList) {
						 //获取索引库集合
					     List<String> suggestedWordList = suggestion.getAlternatives();
					     
					    for (int i = 0; i < suggestedWordList.size(); i++) {
					       String word = suggestedWordList.get(i);
					       
					       suggestedList.add(word);
 
					    }
					     
					   }
					   if(suggestedList.size() >0 ){
				
							  json.put("code", "1");
							  json.put("data", suggestedList);
					   }else{
						   //没有结果
							  json.put("code", "1001"); 
					   }
					    
				  }else{
					  //没有结果
					  json.put("code", "1001"); 
				  }
 
			  }else{
				 //没有检索项 
				json.put("code", "1000");
				  
			  }
			  out.println(json.toString()); 
		  
		  }

 第五步:访问页面查询测试,如图:



 

 

 

转载请注明出处:http://lucien-zzy.iteye.com/admin/blogs/2008291

猜你喜欢

转载自lucien-zzy.iteye.com/blog/2008291