Some tips about crawling large external data with bcs connector51CTO博客 - 千亿集团

Some tips about crawling large external data with bcs connector51CTO博客

2019年04月02日14时25分16秒 | 作者: 然然 | 标签: 办法,一个,需求 | 浏览: 1606

为了让SharePoint的查找组件能够检索外部内容源(外部的数据库、事务体系、二进制文件等等等等),一般需求创立一个自界说的Indexing Connector。Indexing Connector是一种依据SharePoint 2010中的Business Connectivity Services和Search Connector Framework的组件,它代替了曾经的Protocol Handler,成为了SharePoint 2010(和FAST Search for SharePoint 2010)所支撑的首要的外部数据爬网扩展办法。(SharePoint 2010依然支撑自界说的Protocol Handler。)

在经过BCS的办法创立一个Connector之后,或许面临的问题之一,便是需求运用它去爬十分大的数据量。比方,几百万乃至上千万的数据项。假如Connector需求面临这样的应战,那么就需求当心的规划Connector。

首要,Connector需求能够杰出的支撑增量爬网。你必定不期望在增量爬网的速度和彻底爬网相同。

Connector能够以两种办法来支撑增量爬网:依据最终修正时刻(Timestamp-based),和依据修正日志(Changelog-based)。依据最终修正时刻也便是你需求指定一个日期时刻字段,Crawler会将此字段作为数据项的最终修正时刻,当增量爬网时,Crawler会经过比对这个数据,来知道自己是否需求对一个数据项从头进行处理。依据修正日志则是专门经过额定的办法,直接将某个时刻之后新增、被修正、被删去的数据项,回来给查找引擎,这样查找引擎就直接知道了从前次爬网到现在,有哪些数据项需求从头处理。

假如外部内容源的数据量十分巨大,即使是第一次的彻底爬网,也或许导致Crawler不能正常作业,或许导致外部内容源在短时刻内接受过大的压力。

首要,慎重考虑是否直接运用一个Finder办法,来一次性的从外部内容源回来一切所需求的数据(类似于select * from db_table操作)。在小数据量的状况下,这样做很便利,可是假如数据量太大,这么做很或许是不合适的。

比较慎重的做法,是只是运用IdEnumerator办法和SpecificFinder办法获取数据。IdEnumerator办法(类似于select id from db_table)能够回来数据项的ID,然后运用这些ID,重复调用SpecificFinder办法(类似于select * from db_table where id=@id),来一个一个的获取数据项。这时,你需求通知Connector,这个IdEnumerator办法才是整个Entity的RootFinder。在大部分状况下,你乃至不需求去界说一个Finder办法,由于Crawler底子就不应该一次从外部内容源获取过多的数据。

假如数据量超大,乃至IdEnumerator办法的履行或许也是有问题的。幻想一下,一次性从外部数据源回来一切几千万个数据项的ID。这个时分就需求更进一步,让IdEnumerator办法每次只回来特定数量(比方1000)的数据项ID。

咱们能够为IdEnumerator办法界说一个类型为LastId的挑选器和对应的输入参数(即方向为In的Parameter),这样Crawler会测验重复调用IdEnumerator办法,每次都将上一次调用后所得到的最终一个ID,作为参数传入。在IdEnumerator办法的完成代码中,就能够依据这个传入的参数,仅从外部内容源检索此ID之后的数据项ID。

Crawler会测验以下面这种办法,来重复调用IdEnumerator办法,直到它回来0个成果项停止。(每次调用回来多少数据项,只取决于咱们在IdEnumerator办法的完成代码里边回来了多少项。)

查找引擎的Crawler有或许会屡次调用SpecificFinder办法来获取同一个数据项(详细原因不知道...),所以在Connector里边,能够考虑运用一些cache的技巧,来削减向外部内容源恳求数据的次数。假如内容源的数据量很大,将一切数据都一股脑保存到内存里边并不是一个好主意。能够考虑运用HttpRuntime.Cache,尽管看起来它仅能用于Web程序,但实际上只需求在程序中引证System.Web这个程序集,在你的Connector里边运用它是没有问题的(注:微软MSDN文档中注明晰它在非ASP.NET程序中或许无法正常作业,但好像并不存在无法正常作业的状况,但我并不担保...)。这个Cache的完成现已内置了比方主动铲除、优先级设置、缓存时刻设置等等功用,比自己写一个要便利许多。别的EntLib里边也有一个能够用于恣意类型程序的Cache完成。

除了上面所说的这些之外,Eric Wang还奉献过一个idea。那便是,(依照他的观念,)一次性获取很多数据是没有问题的,假如真的碰到超大规模的数据,能够在查找办理中创立多个内容源,每个内容源针对外部数据的一部分进行爬网。比方,假如外部数据有200万项,能够考虑创立4个内容源,每个内容源依据某种区分规矩,获取并爬网其间的50万项数据。

版权声明
本文来源于网络,版权归原作者所有,其内容与观点不代表千亿集团立场。转载文章仅为传播更有价值的信息,如采编人员采编有误或者版权原因,请与我们联系,我们核实后立即修改或删除。

猜您喜欢的文章