`
mxsfengg
  • 浏览: 207868 次
  • 性别: Icon_minigender_1
  • 来自: 广州
社区版块
存档分类
最新评论

solr-dataimportHandler之批量索引

阅读更多

            本文主要讨论solr中的dataImportHandler机制,对这个不熟的朋友,可以先看下。solr  wiki中的dataimporthandler这篇文章,笔者也对dataimporthandler进行了一些翻译,不过效果不是很好,有兴趣的朋友也可以参考一下。  http://mxsfengg.blog.163.com/blog/static/26370218200810250524813/

           想对比较多的数据建立索引,当然要考虑一个量的问题。之前怀疑sqlEntityProcessor是一条条的去数据库中取数据的,因为还有个CachedSqlEntityProcessor,这个类的名字看起来更像是一个能够批量去数据的家伙。

          当然事实证明,笔者之前的想法是错的。

         对于完全导入、即是full-import,来说,我们只需要关注nextRow() 方法的实现。

         

public Map<String, Object> nextRow() {

		//从缓存中取(在sqlEntityProcessor中这个应该是null,因为在设计上,sqlEntityPorcessor并没有实现缓存。)
		if (rowcache != null) {
			return getFromRowCache();
		}
		// 这个只是为了防止rowIterator==null的出现吧
		if (rowIterator == null) {
			String q = getQuery();
			initQuery(resolver.replaceTokens(q));
		}
		while (true) {

			Map<String, Object> r = getNext();
			if (r == null) {
				return null;
			}
			// 使用转化器
			r = applyTransformer(r);
			if (r != null) {
				return r;
			}
		}

	}

            我们可以看到,nextRow一开始去检测 rowcache,这应该是一个缓存的机制,目前,还没有遇到rowcache!=null的情况。我们发现nextRow实际上调用的是getNext(),

 protected Map<String, Object> getNext() {
    try {
      if (rowIterator == null) {
		return null;
	}
      if (rowIterator.hasNext()) {
		return rowIterator.next();
	}
      //如果一个批次结束了,那么就将这个rowIterator,query置为null。
      rowIterator = null;
      query = null;
      return null;
    } catch (Exception e) {
      LOG.log(Level.SEVERE, "getNext() failed for query '" + query + "'", e);
      rowIterator = null;
      query = null;
      throw new DataImportHandlerException(DataImportHandlerException.WARN, e);
    }
  }

         而getNext(),又是简单的调用了,rowIterator的next,我们可以这么认为,nextRow()其实就是返回rowIterator的next()。

         SqlEntityProcessor一次性的从数据库中将数据取出来放在了rowIterator中,供DocBuilder调用。

         粗略的看一下 Docbuilder中的buildDocument这个方法。

 

@SuppressWarnings("unchecked")
  private void buildDocument(VariableResolverImpl vr, SolrWriter.SolrDoc doc,
                             Map<String, Object> pk, DataConfig.Entity entity, boolean isRoot,
                             ContextImpl parentCtx) {

  .............................................
    try {
      while (true) {
           ...................................................................
          Map<String, Object> arow = entityProcessor.nextRow();
          if (arow == null)
            break;

               }

        } catch (DataImportHandlerException e) {
          if (verboseDebug) {
            writer.log(SolrWriter.ENTITY_EXCEPTION, entity.name, e);
          }
          if (isRoot) {
            if (e.getErrCode() == DataImportHandlerException.SKIP) {
              importStatistics.skipDocCount.getAndIncrement();
            } else {
              LOG.log(Level.SEVERE, "Exception while processing: "
                      + entity.name + " document : " + doc, e);
            }
            if (e.getErrCode() == DataImportHandlerException.SEVERE)
              throw e;
          } else
            throw e;
        } finally {
          if (verboseDebug) {
            writer.log(SolrWriter.ROW_END, entity.name, null);
            if (entity.isDocRoot)
              writer.log(SolrWriter.END_DOC, null, null);
          }
        }
      }
    } finally {
      if (verboseDebug) {
        writer.log(SolrWriter.END_ENTITY, null, null);
      }
    }
  }

      这个方法使用while循环一直调用nextrow()方法,直到nextRow返回null值,仔细观察getNext(),我们会发现当rowIterator取完的时候,就会返回null了,而这时候,也就跳出了while这个循环。

      那就是说,sqlEntity会将执行query语句,并将所有的结果一次取回放到rowIterator中。

      现在的问题在于,如果数据库的数量够大,一次取完所有的数据就变得不现实了,那么要怎样才能够实现批次取数据?

      以下是笔者实现的一个例子,当然这个例子有很多纰漏,需要去改进,放在这里当作抛砖引玉吧。

      这是要索引的表:

     

people  CREATE TABLE `people` (                  
          `id` int(11) NOT NULL auto_increment,  
          `name` varchar(20) NOT NULL,           
          PRIMARY KEY  (`id`)                    
        ) ENGINE=InnoDB DEFAULT CHARSET=latin1 

 

      一般情况下,相应的dataConfig.xml文件,我们可以这么写:

  

       <entity name="y" query="select * from people ">
                   <field column="id" name="id" />
                   <field column="name" name="name" />

      </entity>

        这个结构就会一次性从数据库中取完所有的数据,放在rowIterator中,但现在我们并不想这样去实现,以适应更多的数据量。笔者增加了一个表。下面是这个表的数据。

+-----+---------+
| id  | item    |
+-----+---------+
|   1 |       0 |
|   5 |   10000 |
|   6 |   50000 |
|   7 |   60000 |
|   8 |   70000 |
|   9 |   80000 |
|  10 |   90000 |
|  11 |  100000 |
|  12 |  110000 |
|  13 |  120000 |
|  14 |  130000 |
|  15 |  140000 |
|  16 |  150000 |

       修改dataconfig.xml文件

   

<entity name="x" query="select * from item" rootEntity="false">
        <entity name="y" query="select * from people where id between ${x.item} and ${x.item}+1000">
	   <field column="id" name="id" />
                   <field column="name" name="name" />

       </entity>
</entity>

 

         显而易见,笔者是通过增加一个表的方式来达到控制批量存取的效果的。虽然这不失为问题的解决方法,不过增加一个表来这个步骤实在让人觉得有点繁琐,且通用性不强。

         当然我们也可以使用xml来代替数据库中的表,不过这只是一种换汤不换药的方式罢了。

         或许,通过继承SqlEntityProcessor,覆盖nextRow方法,扩展它的功能,也是一种可以尝试的选择。

     

分享到:
评论

相关推荐

    solr-dataimporthandler的jar包

    Solr 数据导入处理器(DataImportHandler,DIH)是 Apache Solr 的一个重要组件,它允许用户从各种数据源,如关系型数据库、CSV 文件等,批量导入数据到 Solr 索引中。这个功能极大地简化了数据同步和更新的过程,...

    apache-solr-dataimportscheduler.jar

    这个jar文件就提供了这样的定时任务能力,使得Solr能够按照预设的时间间隔从数据库或其他数据源批量导入新数据或更新已有数据。 数据导入处理(DataImportHandler,DIH)是Solr内置的一种机制,允许从关系型数据库...

    solr-5.5.5 linux安装包

    3. **导入数据**:使用Solr的DataImportHandler (DIH) 或者通过HTTP接口批量导入数据。 4. **查询数据**:通过Solr的API发送查询请求,获取匹配的结果。 5. **优化索引**:定期执行优化操作,如`optimize`,以提高...

    solr-4.10.4 linux版本亲测可用.zip

    5. **处理大量数据**:Solr支持批量导入数据,如通过DataImportHandler(DIH)从数据库或其他数据源导入。这使得Solr适合处理大规模的数据集。 6. **多语言支持**:Solr内置了多种语言的分析器,包括对中文、英文和...

    Apache Solr(solr-7.7.3.zip)

    - **数据导入工具(DataImportHandler, DIH)**: Solr 提供了一个数据导入工具,可以从关系型数据库或其他数据源批量导入数据到索引。配置好数据源和映射后,运行命令即可完成数据导入。 - **搜索接口(Search API...

    Solr数据库插入(全量和增量)索引

    增量索引是指将新添加或更新的数据插入 Solr 索引库中,一般用于批量更新数据的情况。在这种情况下,我们需要将新添加或更新的数据从数据源中提取出来,然后将其插入 Solr 索引库中。增量索引的优点是可以实时地更新...

    solr增量导入更新索引包

    - **Update Handler**:Solr提供了多种Update Handler,例如Direct Update Handler和Document Update Handler,它们接收单个文档或者批量文档的更新请求,然后进行相应的索引更新,而无需重新构建整个索引。...

    solr4.7服务器

    10. **数据导入**:Solr的DataImportHandler(DIH)允许从关系型数据库或其他数据源批量导入数据,并能自动更新索引。 综上所述,Solr4.7服务器是一个强大的搜索平台,提供了丰富的配置选项和扩展能力。通过适配JDK...

    solr单机-tools.zip

    - **Post工具**:用于向Solr索引中批量添加、更新或删除文档。 - **Schema Browser**:帮助理解字段和核心配置的工具。 - **Luke**:一个可以查看Solr索引细节的工具,包括字段信息、分词等。 "solr单机-tools.zip...

    solr压缩包

    3. **索引创建**:Solr支持多种方式创建索引,如通过XML文件批量导入,或者使用索引API动态添加。用户还可以自定义分析器链,处理文本数据,如分词、去除停用词、词形还原等。 4. **查询与筛选**:Solr提供丰富的...

    solr-ref-guide:Solr 参考指南中文翻译

    3. **数据导入工具**:DataImportHandler (DIH) 允许从数据库或其他数据源批量导入数据到 Solr。 三、文本处理与分析 1. **Analyzer**:Analyzer 负责对输入文本进行预处理,如分词、去除停用词、词形还原等。 2. *...

    solr-succinctly:Solr Succinctly 电子书的练习

    在处理大量数据时,了解Solr的批量导入功能(Solr DataImportHandler, DIH)也是必要的。DIH允许从各种数据源(如数据库)导入数据,可以使用JavaScript编写数据处理脚本来预处理数据。通过JavaScript,你可以实现...

    跟益达学Solr5之增量索引MySQL数据库表数据

    本教程以"跟益达学Solr5之增量索引MySQL数据库表数据"为主题,旨在教授如何利用Solr5来实现对MySQL数据库表数据的增量索引,以便在海量数据中快速检索。 首先,我们需要了解Solr的基本架构。Solr运行在Jetty服务器...

    solr解压版安装包

    5. **上传数据**:Solr支持多种数据导入工具,如DataImportHandler(DIH),用于从数据库或其他数据源导入数据。通过`POST`请求将数据发送到Solr,或者使用`bin/post`脚本来批量导入XML、CSV或JSON格式的数据。 6. ...

    solr教程+实例

    3.3 数据导入导出:使用DataImportHandler (DIH) 导入外部数据库数据,或者通过HTTP API批量上传JSON、XML等格式的数据。 四、Solr实例应用 4.1 创建索引:通过Solr Admin界面或API创建索引,例如为一个博客网站...

    我的配置成功的solr8+tomcat.zip

    这可以通过使用Solr的DataImportHandler(DIH)实现,DIH能够定期或实时地从数据库拉取数据并更新到Solr索引中。配置包括在solrconfig.xml中启用DIH,设置数据源和映射规则,以及可能的触发更新策略。 4. **IK中文...

    Solr调研总结共48页.pdf.zip

    - **批量导入数据**:使用Solr的DataImportHandler或Python脚本批量导入结构化数据。 5. **Solr与C语言、STM32及小程序的结合** - **嵌入式系统集成**:尽管Solr主要应用于服务器端,但通过接口技术,可以与C语言...

    Solr入门使用详解.zip

    同时,Solr还提供了批量导入数据的功能,通过DataImportHandler,可以从数据库或其他数据源高效地导入大量数据。DataImportHandler允许配置数据源连接、SQL查询以及数据转换规则,极大地简化了数据导入过程。 在...

    solr+tomcat处理后的简易部署+说明文档(上)

    7. **导入数据**:使用Solr的DataImportHandler(DIH)或其他方法将数据导入到新创建的核心中。DIH可以从数据库、文件系统或其他数据源批量导入数据。 8. **测试搜索**:一旦数据导入完成,你可以在Solr的搜索界面...

    solr_3.5_配置及应用

    可以使用 DataImportHandler (DIH) 进行批量导入,实现与数据库的集成。 在应用层面,Solr 3.5 提供了以下功能: 1. **全文搜索**:Solr 使用倒排索引技术,支持快速的全文匹配。用户可以通过简单的查询语法进行多...

Global site tag (gtag.js) - Google Analytics