需求:

  从oracle数据库中根据记录的文件名filename_html(多个文件以逗号隔开),文件路径path,备用文件名bakpath中获取

主机172.21.0.31上对应的html文件内容,并且只能通过sftp访问html文件,获取文件内容建立索引.

aaarticlea/png;base64,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" alt="" />

问题:

  目前的难点是字段filename_html中可以有多个文件名,并且多个文件抽取到一个索引字段content下面.另一个是数据访问方式sftp方式.目前DIH组件中没有相应的SFTP访问.

解决方法:

  引入jsch组件包.开发相应SFTP组件.

1.编写BinSFTPDataSource数据源,用于生成响应的InputStream流.编写过程中注意流的关闭,否则容易造成Too many files 异常.

package org.apache.solr.handler.dataimport;

import static org.apache.solr.handler.dataimport.DataImportHandlerException.SEVERE;
import static org.apache.solr.handler.dataimport.DataImportHandlerException.wrapAndThrow; import org.apache.commons.lang.StringUtils;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory; import com.jcraft.jsch.ChannelSftp;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session; import java.io.IOException;
import java.io.InputStream;
import java.util.Properties;
import java.util.regex.Pattern; /**
*/
public class BinSFTPDataSource extends DataSource<InputStream> {
Logger LOG = LoggerFactory.getLogger(BinSFTPDataSource.class); private Session session ;
private ChannelSftp channel;
private InputStream is; private String baseUrl; private String username; private String password; private String host; private int connectionTimeout = CONNECTION_TIMEOUT; private int readTimeout = READ_TIMEOUT; private Context context; private Properties initProps; public BinSFTPDataSource() {
} @Override
public void init(Context context, Properties initProps) {
this.context = context;
this.initProps = initProps; baseUrl = getInitPropWithReplacements(BASE_URL);
String cTimeout = getInitPropWithReplacements(CONNECTION_TIMEOUT_FIELD_NAME);
String rTimeout = getInitPropWithReplacements(READ_TIMEOUT_FIELD_NAME);
username = getInitPropWithReplacements(USERNAME);
password = getInitPropWithReplacements(PASSWORD);
host = getInitPropWithReplacements(HOST);
if (cTimeout != null) {
try {
connectionTimeout = Integer.parseInt(cTimeout);
} catch (NumberFormatException e) {
LOG.warn("Invalid connection timeout: " + cTimeout);
}
}
if (rTimeout != null) {
try {
readTimeout = Integer.parseInt(rTimeout);
} catch (NumberFormatException e) {
LOG.warn("Invalid read timeout: " + rTimeout);
}
}
try {
JSch jsch = new JSch(); // 创建JSch对象
session = jsch.getSession(username, host, PORT);
if (password != null)
session.setPassword(password);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config); session.setTimeout(readTimeout);
session.connect(connectionTimeout);
} catch (JSchException e) {
close();
e.printStackTrace();
}
} @Override
public InputStream getData(String filename) {
if(StringUtils.isEmpty(filename)) return null;
if(StringUtils.isNotEmpty(baseUrl))
filename = baseUrl + filename;
try {
LOG.info("session isConnect:"+session.isConnected());
channel = (ChannelSftp) session.openChannel("sftp");
channel.connect(); // 建立SFTP通道的连接
LOG.info("channel isConnect:"+channel.isConnected());
is = channel.get(filename);
return is;
} catch (Exception e) {
close();
LOG.error("Exception thrown while getting data", e);
wrapAndThrow(SEVERE, e, "Exception in invoking url " +filename);
return null;// unreachable
}
} @Override
public void close() {
if(is!=null)
try {
is.close();
} catch (IOException e) {
e.printStackTrace();
}
if(channel!=null) channel.disconnect();
// if(session!=null) session.disconnect();
} public String getBaseUrl() {
return baseUrl;
} private String getInitPropWithReplacements(String propertyName) {
final String expr = initProps.getProperty(propertyName);
if (expr == null) {
return null;
}
return context.replaceTokens(expr);
} static final Pattern URIMETHOD = Pattern.compile("sftp:/",
Pattern.CASE_INSENSITIVE); public static final String ENCODING = "encoding"; public static final String BASE_URL = "baseUrl"; public static final String UTF_8 = "UTF-8"; public static final String CONNECTION_TIMEOUT_FIELD_NAME = "connectionTimeout"; public static final String READ_TIMEOUT_FIELD_NAME = "readTimeout"; public static final int CONNECTION_TIMEOUT = 5000; public static final int READ_TIMEOUT = 10000; public static final String USERNAME = "username"; public static final String PASSWORD = "password"; public static final String HOST = "host"; public static final int PORT = 22; }

2. 编写URLListEntityProcessor.java类,用于循环遍历多url文件.

package org.apache.solr.handler.dataimport;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map; /**
* 主要用于抽取多个文件内容.可是是本地主机也可以是远程主机上的文件
*/
public class URLListEntityProcessor extends EntityProcessorBase {
/**
* 文件名字符串
*/
protected String fileNames;
/**
* 文件名字符串分隔符
*/
protected String regex; /**
* data-config.xml中给定的基础目录
*/
protected String baseDir; /**
* The recursive given in data-config. Default value is false.
*/
protected boolean recursive = false; @Override
public void init(Context context) {
super.init(context);
fileNames = context.getEntityAttribute(FILE_NAMES);
if (fileNames != null) {
fileNames = context.replaceTokens(fileNames);
}
regex = context.getEntityAttribute(REGEX);
if (regex != null) {
regex = context.replaceTokens(regex);
}
baseDir = context.getEntityAttribute(BASE_DIR);
if (baseDir == null)
throw new DataImportHandlerException(DataImportHandlerException.SEVERE,
"'baseDir' is a required attribute");
baseDir = context.replaceTokens(baseDir); String r = context.getEntityAttribute(RECURSIVE);
if (r != null)
recursive = Boolean.parseBoolean(r);
} @Override
public Map<String, Object> nextRow() {
if (rowIterator != null)
return getNext();
List<Map<String, Object>> fileDetails = new ArrayList<Map<String, Object>>();
getUrls(fileDetails);
rowIterator = fileDetails.iterator();
return getNext();
} private void getUrls(final List<Map<String, Object>> fileDetails) {
String[] names = fileNames.split(regex);
for(String name : names){
Map<String, Object> details = new HashMap<String, Object>();
details.put(FILE_NAME, baseDir+name);
fileDetails.add(details);
}
} public static final String DIR = "fileDir"; public static final String ABSOLUTE_FILE = "fileAbsolutePath"; public static final String FILE_NAME = "fileName"; public static final String FILE_NAMES = "fileNames"; public static final String BASE_DIR = "baseDir"; public static final String REGEX = "regex"; public static final String RECURSIVE = "recursive"; }

3.配置data-config.xml文件:

<dataConfig>
<dataSource name="jdbc" driver="oracle.jdbc.driver.OracleDriver"
url="jdbc:oracle:thin:@127.0.0.1:1522:ORCLLI" user="kms_iep" password="kms_iep" batchSize="2000"/>
<dataSource name="binSftp" type="BinSFTPDataSource"
username="kms" password="kms" host="127.0.0.1"
connectionTimeout="10000" readTimeout="20000" />
<document>
<entity pk="ID" dataSource="jdbc" name="province"
query="select (provincecode || '_' || kng_id) as id,
kng_id,
kng_type as type,
kng_title as title,
provincecode,
opertime,
modify_date,
url,
pack_month_fee,
pack_type,
pack_sen_flow,
filename_html,
('/kmsinterface/jt/province_bak/' || provincecode || '/' ||
to_char(opertime, 'yyyymmdd') || substr(filepath,instr(filepath,'/',2)) || '/'
) as path,
('/kmsinterface/' || provincecode ||filepath) as bakpath
from IEP_UPLOAD_DOCUMENT t
where kng_status = 0 and provincecode='ah' and to_char(opertime,'yyyy-mm-dd')='2014-12-24'
"
deltaQuery="select (provincecode || '_' || kng_id) as id from IEP_UPLOAD_DOCUMENT where kng_status = 0 and opertime &gt; to_date('${dih.last_index_time}','yyyy-mm-dd hh24:mi:ss') order by opertime asc"
deltaImportQuery="select * from (
select (provincecode || '_' || kng_id) as id,
kng_id,
kng_type as type,
kng_title as title,
provincecode,
opertime,
modify_date,
url,
pack_month_fee,
pack_type,
pack_sen_flow,
filename_html,
('/kmsinterface/jt/province_bak/' || provincecode || '/' ||
to_char(opertime, 'yyyymmdd') || substr(filepath,instr(filepath,'/',2)) || '/' ) as path,
('/kmsinterface/' || provincecode ||filepath) as bakpath
from IEP_UPLOAD_DOCUMENT t
where kng_status = 0 )
where id = '${dih.delta.ID}'"
deletePKQuery="select (provincecode || '_' || kng_id) as id from IEP_UPLOAD_DOCUMENT where kng_status = 1 and opertime &gt; to_date('${dih.last_index_time}','yyyy-mm-dd hh24:mi:ss') order by id desc"
transformer="DateFormatTransformer,RegexTransformer"
onError="skip">
<field column="ID" name="id" />
<field column="KNG_ID" name="kng_id" />
<field column="type" name="type" />
<field column="TITLE" name="title" />
<field column="PROVINCECODE" name="provincecode" />
<field column="OPERTIME" name="opertime" dateTimeFormat="yyyy-MM-dd HH:mm:ss"/>
<field column="MODIFY_DATE" name="modify_date" dateTimeFormat="yyyy-MM-dd HH:mm:ss"/>
<field column="URL" name="url" />
<field column="PACK_MONTH_FEE" name="pack_month_fee" />
<field column="PACK_TYPE" name="pack_type" />
<field column="PACK_SEN_FLOW" name="pack_sen_flow" />
<entity name="urllist1" processor="URLListEntityProcessor"
baseDir="/kms/solr${province.PATH}"
fileNames="${province.FILENAME_HTML}" regex=","> <!--解析附件-->
<entity name="test1" processor="TikaEntityProcessor" url="${urllist1.fileName}"
dataSource="url" format="text"
transformer="HTMLStripTransformer,RegexTransformer" onError="skip">
<field column="text" name="content" stripHTML="true" regex="\t|\r|\n|\s" replaceWith="" />
</entity>
</entity> <entity name="urllist2" processor="URLListEntityProcessor"
baseDir="/kms/solr${province.BAKPATH}"
fileNames="${province.FILENAME_HTML}" regex=","> <entity name="test2" processor="TikaEntityProcessor" url="${urllist2.fileName}"
dataSource="url" format="text"
transformer="HTMLStripTransformer,RegexTransformer" onError="skip">
<field column="text" name="content" stripHTML="true" regex="\t|\r|\n|\s" replaceWith="" />
</entity>
</entity> </entity>
</document>
</dataConfig>

solr中通过SFTP访问文件建立索引的更多相关文章

  1. 利用Lucene将被索引文件目录中的所有文件建立索引

    1.新建两个文件夹htm和index,其中htm中存放被索引的文件,index文件中存放建立的索引文件. 2.新建解析目录中所有文件的类,用来解析指定目录下的所有文件. import java.io. ...

  2. Solr学习笔记之3、Solr dataimport - 从SQLServer导入数据建立索引

    Solr学习笔记之3.Solr导入SQLServer数据建立索引 一.下载MSSQLServer的JDBC驱动 下载:Microsoft JDBC Driver 4.0 for SQL Server ...

  3. SQL Server 2008中如何为XML字段建立索引

    from:http://blog.csdn.net/tjvictor/article/details/4370771 SQL Server中的XML索引分为两类:主XML 索引和辅助XML索引.其中辅 ...

  4. 如何在Linux中使用sFTP上传或下载文件与文件夹

    如何在Linux中使用sFTP上传或下载文件与文件夹 sFTP(安全文件传输程序)是一种安全的交互式文件传输程序,其工作方式与 FTP(文件传输协议)类似. 然而,sFTP 比 FTP 更安全;它通过 ...

  5. SQL 数据优化之不建立索引的情况

    索引可以提高数据的检索效率,也可以降低数据库的IO成本,并且索引还可以降低数据库的排序成本.排序分组操作主要消耗的就是CPU资源和内存,所以能够在排序分组操作中好好的利用索引将会极大地降低CPU资源的 ...

  6. MYSQL建立索引需要注意几点

    1.建立索引的时机:若表中的某字段出现在select.过滤.排序条件中,为该字段建立索引是值得的.2.对于like '%xxx'的模糊查询,普通的索引是无法满足的,需要建立全文索引.3.对于有多个条件 ...

  7. SQL Server MYSQL 对外键建立索引的必要性

    背景: 大家知道在定义外键时,都会给出on delete .....   on update .....: 这里指定的就是当主表的列发生变化时,从表的列要用怎么样的变化去迎合.对从表中的外键,建立索引 ...

  8. Python第五天 文件访问 for循环访问文件 while循环访问文件 字符串的startswith函数和split函数 linecache模块

    Python第五天   文件访问    for循环访问文件    while循环访问文件   字符串的startswith函数和split函数  linecache模块 目录 Pycharm使用技巧( ...

  9. Java随机访问文件

    使用随机访问文件,我们可以从文件读取以及写入文件.使用文件输入和输出流的读取和写入是顺序过程.使用随机访问文件,可以在文件中的任何位置读取或写入.RandomAccessFile类的一个对象可以进行随 ...

随机推荐

  1. 构建Spark作业

    首先,要清楚,一个Java或Scala或python实现的Spark作业. 1.用sbt构建Spark作业 2.用Maven构建Spark作业 3.用non-maven-aware工具构建Spark作 ...

  2. c#读properties文件

    @(编程) properties文件 MONGO_URL = mongodb://172.16.20.3/srtc_dc CURRENT_VERSION = 2.0 IS_AUTO_UPDATE = ...

  3. HTTP中缓存相关

    1.客户端如何区分缓存命中和未命中 两种情况下,返回的状态码都是200,客户端有一个方法可以判断,就是使用Date首部,将Date首部与当前时间进行比较,如果响应中时间日期值比较早,客户端可以认为这是 ...

  4. UDP广播问题

    http://bbs.csdn.net/topics/390218123 Broadcast Address(广播地址)是专门用于同时向网络中所有工作站进行发送的一个地址.在使用TCP/IP 协议的网 ...

  5. *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL

    kei编译时提示: *** WARNING L1: UNRESOLVED EXTERNAL SYMBOL *** WARNING L1:reference made to unresolved ext ...

  6. HDU 2859 Phalanx (dp)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=2859 给你一个n*n的矩阵,问你最大的对称度是多少(左下右上为对称线) dp[i][j]表示i行j列元 ...

  7. ZOJ1648 Circuit Board(线段相交)

    裸的判断线段相交

  8. 解决sencha touch显示.JSON包含中文数据时显示乱码问题

    按照ST官方示例navigationview做的一个示例.数据源是一个.json文件.但是显示的时候如果.json文件里有中文则乱码.我知道是编码问题,但是不知道怎么改,如何改. 问了N个人最后解决方 ...

  9. android 简易定时器

    定时器 1.在android 应用开发当中,很多时候都要用到定时器,而要实现定时器更多的时候要用到两个类:Timer,和TimerTask 2.API对Timer的解释是:

  10. 以静态变量保存 Spring ApplicationContext

    package com.thinkgem.jeesite.common.utils; import java.net.HttpURLConnection; import java.net.URL; i ...