设为首页 收藏本站
查看: 1580|回复: 0

[经验分享] Solr从Mongodb索引数据(上) 借助mongodb-jdbc和配置JdbcDataSource

[复制链接]

尚未签到

发表于 2015-7-18 10:16:53 | 显示全部楼层 |阅读模式
  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

所有资源均系网友上传或者通过网络收集,我们仅提供一个展示、介绍、观摩学习的平台,我们不对其承担任何法律责任,如涉及侵犯版权等问题,请您及时通知我们,我们将立即处理,联系人Email:kefu@iyunv.com,QQ:1061981298 本贴地址:https://www.yunweiku.com/thread-87901-1-1.html 上篇帖子: 企业级搜索引擎Solr 第三章 索引数据(Indexing Data)[1] 下篇帖子: linux下部署solr到tomcat
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

扫码加入运维网微信交流群X

扫码加入运维网微信交流群

扫描二维码加入运维网微信交流群,最新一手资源尽在官方微信交流群!快快加入我们吧...

扫描微信二维码查看详情

客服E-mail:kefu@iyunv.com 客服QQ:1061981298


QQ群⑦:运维网交流群⑦ QQ群⑧:运维网交流群⑧ k8s群:运维网kubernetes交流群


提醒:禁止发布任何违反国家法律、法规的言论与图片等内容;本站内容均来自个人观点与网络等信息,非本站认同之观点.


本站大部分资源是网友从网上搜集分享而来,其版权均归原作者及其网站所有,我们尊重他人的合法权益,如有内容侵犯您的合法权益,请及时与我们联系进行核实删除!



合作伙伴: 青云cloud

快速回复 返回顶部 返回列表