solr4.0.0学习(二) 数据库导入clob与blob为索引
导入clob很简单。但是blob好像没有提供方法,所以改了一下源码,重新编译替换class文件,竟然成功了。
先把配置文件贴上
SCHEMA.XML
package org.apache.solr.handler.dataimport;import java.io.BufferedReader;import java.io.IOException;import java.io.InputStream;import java.io.InputStreamReader;import java.io.Reader;import java.sql.Blob;import java.sql.Clob;import java.sql.SQLException;import java.util.ArrayList;import java.util.List;import java.util.Map;public class ClobTransformer extends Transformer{ public static final String CLOB = "clob"; public Object transformRow(Map<String, Object> aRow, Context context) { for (Map map : context.getAllEntityFields()) { if ("true".equals(map.get("clob"))) { String column = (String)map.get("column"); String srcCol = (String)map.get("sourceColName"); if (srcCol == null) srcCol = column; Object o = aRow.get(srcCol); if ((o instanceof List)) { List inputs = (List)o; List results = new ArrayList(); for (Object input : inputs) { if ((input instanceof Clob)) { Clob clob = (Clob)input; results.add(readFromClob(clob)); }else if(input instanceof Blob){ Blob blob = (Blob)input; results.add(readFromBlob(blob)); } } aRow.put(column, results); } else if ((o instanceof Clob)) { Clob clob = (Clob)o; aRow.put(column, readFromClob(clob)); }else if(o instanceof Blob){ Blob blob = (Blob)o; aRow.put(column, readFromBlob(blob)); } } } return aRow; } private String readFromBlob(Blob blob) { try{ InputStream is = blob.getBinaryStream();BufferedReader br = new BufferedReader(new InputStreamReader(is));String str = "";String res = "";while((str=br.readLine())!=null){res += str;}return res; }catch (Exception e) { e.printStackTrace(); return "";}}private String readFromClob(Clob clob) { Reader reader = null;try {reader = clob.getCharacterStream();} catch (SQLException e1) {e1.printStackTrace();} StringBuilder sb = new StringBuilder(); char[] buf = new char[1024]; try { int len; while ((len = reader.read(buf)) != -1) sb.append(buf, 0, len); } catch (IOException e) { DataImportHandlerException.wrapAndThrow(500, e); } return sb.toString(); }}
这里加了一个readFromBlob方法,加了两个else if。异常的处理很粗糙。
这样替换class文件,导入索引就正常了。在query ":" 页面的response会出现所有blob内容。
如果response没有blob字段或者显示为对象地址,都是错了。