首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 数据库 > 其他数据库 >

solr4.0.0学习(2) 数据库导入clob与blob为索引

2013-10-10 
solr4.0.0学习(二) 数据库导入clob与blob为索引导入clob很简单。但是blob好像没有提供方法,所以改了一下源

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字段或者显示为对象地址,都是错了。



热点排行