Mongodb越来越流行,这边也用Mongodb去存储大量数据.但碰到一个问题,如何通过Solr从Mongodb中获取数据以及索 引?Mongodb提供了DataImportHandler去索引数据,目前支持以下几种数据来 源:JdbcDataSource,ContentStreamDataSource,FieldReaderDataSource,MockDataSource,URLDataSource
用得比较多的还是JdbcDataSource,Solr对它的支持也比较完善,如增量索引.但Mongodb并不支持JDBC(貌似也不可能支持),提供了自己的
Driver:mongo-java-driver,下载地址:https://github.com/mongodb/mongo-java-driver/downloads.
但由于之前项目较紧,自己写个针对Mongodb的DataImportHandler又来不及.于是google下下,找到了mongo-jdbc.下载地址:https://github.com/erh/mongo-jdbc
mongo-jdbc估计就是个翻译,将mongo-java-driver翻译成JDBC,如连接,查询,插入等.自己也没来得及细看.但集成到Solr中还是发现一些问题,因为Solr中利用JDBC的一些特性mongo-jdbc并不支持,无奈只能修改部分源码来赶鸭子上架.但这也只是权宜之计,等时间充沛再针对mongodb写一个DataImportHandler吧.
这里先说明下如何使用:
1.建立db-data-config.xml,我这边示例如下:
主要修改dataSource中driver,url.其他基本类似.
2.如此就可以运行了,在浏览器中输入导入http请求,如:http://localhost:8080/solr1.4/core0/dataimport?command=full-import
但发现会报一系列错误.这也是我以上提的,Solr中需要JDBC一些特性,但mongo-jdbc中并不支持.这只能修改源码了.修改地方如下,
主要修改两个类,一个是Solr中的JdbcDataSource,另外一个是mongo-jdbc中的MongoResultSet:
1)org.apache.solr.handler.dataimport.JdbcDataSource
a) 需要替换一个地方,具体看注释
protected Callable createConnectionFactory(final Context context, final Properties initProps) {
// 略
if (url != null) {
// 郭芸修改,不支持MongoDB
// 将c = DriverManager.getConnection(url, initProps)替换成如下
//c = DriverManager.getConnection(url, initProps);
if(url.startsWith("mongodb:")){
c=DriverManager.getConnection(url);
}else{
c = DriverManager.getConnection(url, initProps);
}
}
// 略
}
b) 需要替换三个地方,具体请看注释
private class ResultSetIterator {
// 略
public ResultSetIterator(String query) {
// 略
Connection c = getConnection();
// 郭芸修改,MongoDB暂还不支持
// stmt = c.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY); 替换成如下
/*stmt = c.createStatement(ResultSet.TYPE_FORWARD_ONLY,ResultSet.CONCUR_READ_ONLY);*/
stmt = c.createStatement();
// 略
// 郭芸修改,MongoDB-JDBC暂还不支持
// 替换以下注释语句
/*if (stmt.execute(query)) {
resultSet = stmt.getResultSet();
}*/
resultSet=stmt.executeQuery(query);
// 略
// 郭芸修改,MongoDB-JDBC还不支持元数据
// 替换以下注释语句
//colNames = readFieldNames(resultSet.getMetaData());
if(resultSet instanceof MongoResultSet){
MongoResultSet rs=(MongoResultSet)resultSet;
colNames=rs.getColNames();
}else{
colNames = readFieldNames(resultSet.getMetaData());
}
}
}
2)com.mongodb.jdbc.MongoResultSet
a)需要增加一个方法,具体如下:
// 郭芸修改,以便可以获取Field Name,solr中JdbcDataSource需要根据Filed name来匹配以及获取数据
public List getColNames(){
List colNames=new ArrayList();
String colName;
for(int i=1;i
运维网声明
1、欢迎大家加入本站运维交流群:群②:261659950 群⑤:202807635 群⑦870801961 群⑧679858003
2、本站所有主题由该帖子作者发表,该帖子作者与运维网 享有帖子相关版权
3、所有作品的著作权均归原作者享有,请您和我们一样尊重他人的著作权等合法权益。如果您对作品感到满意,请购买正版
4、禁止制作、复制、发布和传播具有反动、淫秽、色情、暴力、凶杀等内容的信息,一经发现立即删除。若您因此触犯法律,一切后果自负,我们对此不承担任何责任
5、所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其内容的准确性、可靠性、正当性、安全性、合法性等负责,亦不承担任何法律责任
6、所有作品仅供您个人学习、研究或欣赏,不得用于商业或者其他用途,否则,一切后果均由您自己承担,我们对此不承担任何法律责任
7、如涉及侵犯版权等问题,请您及时通知我们,我们将立即采取措施予以解决
8、联系人Email:admin@iyunv.com 网址:www.yunweiku.com