`

suggest 输入拼音提示中文1.0.0

    博客分类:
  • Solr
阅读更多

 

转载请注明出处: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

  • 大小: 11.9 KB
  • 大小: 11.1 KB
  • 大小: 11.4 KB
  • 大小: 7.4 KB
  • jar.rar (52.6 KB)
  • 下载次数: 277
2
0
分享到:
评论
15 楼 chyou1988 2016-09-13  
博主,solr 4.6.1 用了 这个拼音包 以后,每次都是重启后拼音台式才能生效
14 楼 a3802893 2015-11-26  
5.3的也不能用,有新版本可以使用的吗?
13 楼 u012183952 2015-04-27  
at shentong.tsearch.spelling.suggest.py.PYLookup.lookup(PYLookup.java:200)
at shentong.tsearch.spelling.suggest.Suggester.getSuggestions(Suggester.java:195)
at org.apache.solr.handler.component.SpellCheckComponent.process(SpellCheckComponent.java:172)
at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:208)
at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:135)
at org.apache.solr.core.RequestHandlers$LazyRequestHandlerWrapper.handleRequest(RequestHandlers.java:242)
at org.apache.solr.core.SolrCore.execute(SolrCore.java:1816)
at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:656)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:359)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:155)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:235)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:103)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:293)
at org.apache.coyote.http11.Http11Processor.process(Http11Processor.java:861)
at org.apache.coyote.http11.Http11Protocol$Http11ConnectionHandler.process(Http11Protocol.java:620)
at org.apache.tomcat.util.net.JIoEndpoint$Worker.run(JIoEndpoint.java:489)
at java.lang.Thread.run(Thread.java:745)

请问这个是什么问题?
12 楼 1074126612 2015-04-09  
Caused by: java.lang.AbstractMethodError: org.apache.lucene.search.suggest.Lookup.build(Lorg/apache/lucene/search/suggest/InputIterator;)V 楼主这是那里的错误?、??
11 楼 lucien_zzy 2015-01-13  
xuriyunhai 写道
博主能把tsearch_lib.jar的代码共享吗?现在solr升级到4.10.2了,貌似不兼容


        文章下方有jar包下载地址
10 楼 xuriyunhai 2014-12-17  
博主能把tsearch_lib.jar的代码共享吗?现在solr升级到4.10.2了,貌似不兼容
9 楼 lucien_zzy 2014-10-29  
kehuixu 写道
博主,问一下,建议的时候是如何从拼音转换为中文的。真心不明白


核心转换在jar包里
8 楼 yjfeng1133 2014-09-29  
yjfeng1133 写道
建立索引后不能直接得到中文的suggest。
为什么我需要重启solr才能得到中文的suggest?


我用的solr 4.4 hadoop下的solrcloud
7 楼 yjfeng1133 2014-09-29  
建立索引后不能直接得到中文的suggest。
为什么我需要重启solr才能得到中文的suggest?
6 楼 wangyoulin006 2014-09-12  
4.9solr部署报错。麻烦请帮忙看下是什么情况啊。谢谢
java.lang.AbstractMethodError
at org.apache.lucene.search.suggest.Lookup.build(Lookup.java:190)
at shentong.tsearch.spelling.suggest.Suggester.build(Suggester.java:142)
at org.apache.solr.handler.component.SpellCheckComponent.prepare(SpellCheckComponent.java:125)
at org.apache.solr.handler.component.SearchHandler.handleRequestBody(SearchHandler.java:197)
at org.apache.solr.handler.RequestHandlerBase.handleRequest(RequestHandlerBase.java:135)
at org.apache.solr.core.RequestHandlers$LazyRequestHandlerWrapper.handleRequest(RequestHandlers.java:241)
at org.apache.solr.core.SolrCore.execute(SolrCore.java:1962)
at org.apache.solr.servlet.SolrDispatchFilter.execute(SolrDispatchFilter.java:777)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:418)
at org.apache.solr.servlet.SolrDispatchFilter.doFilter(SolrDispatchFilter.java:207)
at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:241)
at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:208)
at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:220)
at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:122)
at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:170)
at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:98)
at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:950)
at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:116)
at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:408)
at org.apache.coyote.http11.AbstractHttp11Processor.process(AbstractHttp11Processor.java:1040)
at org.apache.coyote.AbstractProtocol$AbstractConnectionHandler.process(AbstractProtocol.java:607)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.doRun(AprEndpoint.java:2441)
at org.apache.tomcat.util.net.AprEndpoint$SocketProcessor.run(AprEndpoint.java:2430)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1145)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:615)
at java.lang.Thread.run(Thread.java:744)
5 楼 kehuixu 2014-03-11  
博主,问一下,建议的时候是如何从拼音转换为中文的。真心不明白
4 楼 lucien_zzy 2014-01-26  
写得不错,但博主能不能补充一下拼写检查的调用实例


拼写检查类似,query中的 qt 改为 spell 就行。。。
3 楼 lucien_zzy 2014-01-23  
ayongdong 写道
例子的jar包不能下载


可以下载的,直接点击jar.rar就下了
2 楼 ayongdong 2014-01-23  
例子的jar包不能下载
1 楼 sealbird 2014-01-23  
写得不错,但博主能不能补充一下拼写检查的调用实例



=========================================================================================
www.idouye.cn 土木工程网

相关推荐

Global site tag (gtag.js) - Google Analytics