导入clob很简单。但是blob好像没有提供方法,所以改了一下源码,重新编译替换class文件,竟然成功了。

先把配置文件贴上

SCHEMA.XML

<?xml version="1.0" ?>
<schema name="test" version="1.1">
<types>
<fieldtype name="string" class="solr.StrField" sortMissingLast="true" omitNorms="true"/> <fieldType name="standard" class="solr.TextField" positionIncrementGap="100">
<analyzer type="index">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
<analyzer type="query">
<tokenizer class="solr.StandardTokenizerFactory"/>
<filter class="solr.StopFilterFactory" ignoreCase="true" words="stopwords.txt" enablePositionIncrements="true" />
<filter class="solr.LowerCaseFilterFactory"/>
</analyzer>
</fieldType> <fieldType name="ik" class="solr.TextField">
<analyzer class="org.wltea.analyzer.lucene.IKAnalyzer"/>
</fieldType> </types> <fields>
<field name="blogId" type="string" indexed="false" stored="true" multiValued="false"/>
<field name="blogTitle" type="ik" indexed="true" stored="true" multiValued="false" />
<field name="blogAuthorName" type="ik" indexed="true" stored="true" multiValued="false" />
<field name="blogContent" type="ik" indexed="true" stored="true" multiValued="false" />
<field name="TITLE" type="ik" indexed="true" stored="true" />
<field name="TEXT" type="ik" indexed="true" stored="true" />
</fields>
<defaultSearchField>blogTitle</defaultSearchField>
<solrQueryParser defaultOperator="OR"/> </schema>

这里的field只用到了blogContent一个。

SOLRCONFIG.XML

<?xml version="1.0" encoding="UTF-8" ?>
<config>
<luceneMatchVersion>LUCENE_34</luceneMatchVersion>
<directoryFactory name="DirectoryFactory" class="${solr.directoryFactory:solr.StandardDirectoryFactory}"/>
<updateHandler class="solr.DirectUpdateHandler2" /> <requestDispatcher handleSelect="true" >
<requestParsers enableRemoteStreaming="false" multipartUploadLimitInKB="2048" />
</requestDispatcher> <requestHandler name="standard" class="solr.StandardRequestHandler" default="true" />
<requestHandler name="/update" class="solr.XmlUpdateRequestHandler" />
<requestHandler name="/admin/" class="org.apache.solr.handler.admin.AdminHandlers" /> <!-- the dataimport requestHandler -->
<requestHandler name="/dataimport" class="org.apache.solr.handler.dataimport.DataImportHandler">
<lst name="defaults">
<str name="config">db-data-config.xml</str>
</lst>
</requestHandler> <admin>
<defaultQuery>solr</defaultQuery>
</admin>
<unlockOnStartup>true</unlockOnStartup>
<lockType>simple</lockType>
<requestHandler name="/analysis/field"
startup="lazy"
class="solr.FieldAnalysisRequestHandler" /> </config>

db-data-config.xml

<dataConfig>
<dataSource name="f1" type="FieldStreamDataSource"/>
<dataSource driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1521:orcl" user="HT" password="HT"/>
<document>
<entity name="blog" query="SELECT BLOG_CONTENT from TB_ENT_BLOG" transformer="ClobTransformer">
<field column="BLOG_CONTENT" name="blogContent" clob="true"/>
</entity>
</document>
</dataConfig>

然后修改了ClobTransformer.java。使其同时支持BLOG格式。

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

solr4.0.0学习(二) 数据库导入clob与blob为索引的更多相关文章

  1. Redis 3.0中文版学习(二)

    网址:http://wiki.jikexueyuan.com/project/redis-guide/entry-to-master-middle.html 1.Redis的列表: 采用链表的实现方法 ...

  2. python 3+djanjo 2.0.7简单学习(二)--创建数据库和模型

    我们紧接上次,这里将建立数据库,创建第一个模型提示:这里我们不需要去一直启动,django会在我们ctrl+s的时候自动刷新并启动服务,很方便吧  1.数据库配置 现在,打开 vote_mysite/ ...

  3. Solr4.8.0源码分析(19)之缓存机制(二)

    Solr4.8.0源码分析(19)之缓存机制(二) 前文<Solr4.8.0源码分析(18)之缓存机制(一)>介绍了Solr缓存的生命周期,重点介绍了Solr缓存的warn过程.本节将更深 ...

  4. Solr学习(2) Solr4.2.0+IK Analyzer 2012

    Solr学习(二) Solr4.2.0+IK Analyzer 2012 开场白: 本章简单讲述如何在solr中配置著名的 IK Analyzer 分词器. 本章建立在 Solr学习(一)  基础上进 ...

  5. 【Flask】 python学习第一章 - 6.0 WTF表单 数据库 蓝图

    WTF表单  wtf.py pip install flask-wtf  # 安装 from flask_wtf import FlaskForm from wtform import StringF ...

  6. Solr4.8.0源码分析(21)之SolrCloud的Recovery策略(二)

    Solr4.8.0源码分析(21)之SolrCloud的Recovery策略(二) 题记:  前文<Solr4.8.0源码分析(20)之SolrCloud的Recovery策略(一)>中提 ...

  7. Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 数据库版本控制器 完全破解+使用教程

    原文:Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 数据库版本控制器 完全破解+使用教程 Red Gate系列之二 SQL Source Co ...

  8. solr8.0 从数据库导入数据(三)

    第一步:导入相关包: 在创建的核心目录下新建lib文件夹(如果有,无需建立),从Solr源码包的dist文件夹中导入两个solr-dataimporthandler包,以及一个mysql驱动包. 第二 ...

  9. Swift3.0基础语法学习<二>

    对象和类: // // ViewController2.swift // SwiftBasicDemo // // Created by 思 彭 on 16/11/15. // Copyright © ...

随机推荐

  1. js 遍历json对象

    //方法一: var data=[{name:"a",age:12},{name:"b",age:11},{name:"c",age:13} ...

  2. python 数据类型(元组(不可变列表),字符串

    元组(不可变列表) 创建元组: ages = (11, 22, 33, 44, 55) 或 ages = tuple((11, 22, 33, 44, 55)) 一般情况下是不需要被人该的数值才使用元 ...

  3. Apache配置允许文件索引

    这两天在看bootstrap的文档,所以在本地搭建了一个web server. 这里记下Apache的一个小配置: LISTEN *:8000 <VirtualHost *:8000> A ...

  4. 教你在你的应用程序中扩展使用dynamic类型

    教你在你的应用程序中扩展使用dynamic类型 相信大家在开发中经常会接触到mvc中的ViewBag,有心的同学会,发现这就是一个dynamic类型,查看源码一谈究竟,本文也是根据dynamic来扩展 ...

  5. discuz论坛很给力

    11.10:老彭在搭建好论坛. 11.17:  主网站导航中加入“论坛” 11.20: 使用“T客在线”的版本将论坛全新改版. 新版论坛非常大气,让网站增色不少.

  6. JavaScript 将字符串转化为json对象

    var json = eval('(' + data + ')'); 其中data为字符串数据

  7. Android 联系人信息的读取注意判断是否为NULL Android联系人的删除实质

    在Android系统联系人界面删除一条短信实际上并不是真正的删除,而是在数据库中标记raw_contacts表中Contact_id为null以及data表中raw_contact_id为空,这是为了 ...

  8. [wikioi]没有上司的舞会

    树形DP.用F[k][0]和F[k][1]表示某节点不选和选了之后子树的最大值.那么:f[i][0]=sigma(max(f[k][0],f[k][1]))f[i][1]=sigma(f[k][0]) ...

  9. ANDROID_MARS学习笔记_S04_002_用AsyncTask实现异步操作

    一.简介 二.代码1.xml(1)activity_main.xml <?xml version="1.0" encoding="utf-8"?> ...

  10. Android 获取SDCard中某个目录下图片

    本文介绍Android开发中如何获取SDCard中某目录下的所有图片并显示出来,下面的我们提供的这个函数是通用的,只要提供路径就可以查询出该目录下所有图片的路径信息,并保存到一个List<Str ...