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