首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 网络技术 > 网络基础 >

solr-dataimportHandler之批量目录

2012-10-25 
solr-dataimportHandler之批量索引??????????? 本文主要讨论solr中的dataImportHandler机制,对这个不熟的

solr-dataimportHandler之批量索引

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

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

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

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

?????????

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

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

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

?

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

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

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

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

????? 这是要索引的表:

?????

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

?

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

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

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

?????

热点排行