solr 自定义Handler

1 修改solrconfig.xml配置文件
<requestHandler name="/ext" class="extDictHandler.ExtDictHandler"> 
  <lst name="defaults">
       <str name="echoParams">explicit</str>
       <str name="wt">json</str>
       <str name="indent">true</str>
       <str name="df">text</str>
     </lst>
</requestHandler>
2 创建ExtDictHandler类并且继承RequestHandlerBase

public class ExtDictHandler extends RequestHandlerBase {
	
	
	  @Override
	  @SuppressWarnings("unchecked")
	  public void handleRequestBody(SolrQueryRequest req, SolrQueryResponse rsp)
	          throws Exception {
	    rsp.setHttpCaching(false);
	    
	    //TODO: figure out why just the first one is OK...
	    ContentStream contentStream = null;
	    Iterable<ContentStream> streams = req.getContentStreams();
	    if(streams != null){
	      for (ContentStream stream : streams) {
	          contentStream = stream;
	          break;
	      }
	    }
	    SolrParams params = req.getParams();
	    RequestInfo requestParams = new RequestInfo(req, getParamsMap(params), contentStream);
	    String command = requestParams.getCommand();
	    //value 表示自定义扩展分词词元 
	    if(command != null && Constant.EXT_DICT_ADD_UPDATE.equals(command)){
	    	rsp.add("command", command);
	    	String value=params.get("value");
	    	String type=params.get("type");
    		String fileName=ConfigHelper.extDictFile;
    		if (type!=null && ("0".equals(type)|| "1".equals(type)) && value!=null && !"".equals(value.trim()) ){
    			try{
    				begin(value.trim(),type,fileName);
    				rsp.add("status", "OK");
    				rsp.add("statusMessages", "操作成功");
    			}catch (Exception e) {
    				rsp.add("status", "FAIL");
    				rsp.add("statusMessages", e);
				}
    		}else{
    			rsp.add("status", "FAIL");
    			rsp.add("statusMessages", "参数异常");
    		}
	    }else{
	    	rsp.add("status", "FAIL");
			rsp.add("statusMessages", "请输入正确的command");
	    }
	    RequestHandlerUtils.addExperimentalFormatWarning(rsp);
	 }
	  
	 
	 //主方法 
	 public synchronized void begin(String value,String type,String fileName) throws IOException{
		 Dictionary dictionary=Dictionary.getSingleton();
		 //将扩展词写入到内存中实现实时性
		 dictionary.fillSegMent(value, type);
		 if(type!=null&& "0".equals(type.trim())){
			 deleteFileLine(fileName,value);
		 }else if(type!=null&& "1".equals(type.trim())){
			 writerFile(fileName,value,true);
		 }
	 }
	 //删除扩展词行
	 public  void deleteFileLine(String fileName,String value) throws IOException{
		 BufferedReader read=new BufferedReader(new FileReader(fileName));
		 StringBuffer buffer =new StringBuffer();
		 String line=null;
		 //判断是否需要覆盖扩展词
		 Boolean needReWriter=false;
		 while((line=read.readLine())!=null){
			 if (!value.equals(line.trim()))
				 buffer.append(line+"\n");
			 else
				 needReWriter=true; 
		 }
		 if (needReWriter)
			 writerFile(fileName,buffer.toString(),false);
	 } 
	 //flag 为ture时表示末尾追加行 false表示文本替换
	 public void writerFile(String fileName,String value,Boolean flag) throws IOException{
		FileWriter  fw=new FileWriter(fileName, flag);    
 	    BufferedWriter   bw=new   BufferedWriter(fw);  
 	    if (flag)
 	    	bw.newLine();  
 	    bw.write(value.trim());    
 	    bw.flush();    
 	    bw.close();    
 	    fw.close();
	 }
	 private Map<String, Object> getParamsMap(SolrParams params) {
		    Iterator<String> names = params.getParameterNamesIterator();
		    Map<String, Object> result = new HashMap<String, Object>();
		    while (names.hasNext()) {
		      String s = names.next();
		      String[] val = params.getParams(s);
		      if (val == null || val.length < 1)
		        continue;
		      if (val.length == 1)
		        result.put(s, val[0]);
		      else
		        result.put(s, Arrays.asList(val));
		    }
		    return result;
		  }
	@Override
	public String getDescription() {
		return Constant.JMX_DESC;
	}
	@Override
	public String getSource() {
		// TODO Auto-generated method stub
		return "$Source$";
	}
}
注意* 里边涉及到了ik分词的知识点需要修改ik源码,这里只提供参考自定义Handler

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值