coreseek 利用python作数据源建立索引

用python作数据源的原因:[官网][1]上称python为万能数据源
    1. 可以使用任何数据来源,xml,txt,sql 等等
    2. 给用户(程序员)在建立索引前对数据作处理的机会,比如做过滤、权重计算等
如果有以上两种情况的话,用python做数据源是一个理想的方案,但由此而来的是建立索引的效率降低。因为sphinx/coreseek的indexer速度非常快,而逻辑处理模块跟不上索引(indexer)的速度,导致建立索引速度变慢,特别是处理逻辑稍微复杂一点的话,效率更低。因此必须想办法加快处理的速度来匹配indexer的速度。
首先来分析一下整个建立索引的过程:
     - 取原始数据
     - 处理数据
     - 索引
因此可以分为三个模块:
     - dataFetchter
     - dataProcessor
     - dataIndexer
dataFetcher有两个任务,1.负责取原始数据,原始数据可以为任意来源任意形式;2.负责统一数据格式,提供给dataProcessor处理。
dataProcessor负责业务处理部分,根据各自的应用有不同的处理逻辑,如黑名单过滤,商品下架处理,计算自然排序权重等。处理完的结果直接提供给dataIndexer使用。
dataIndexer负责建立索引,即coreseek提供的indexer。

分析一下这三个模块的速度:dataIndexer使用的是第三方(sphinx/coreseek)软件,而且速度非常快,不在优化的考虑范围之内。而dataFetchter和dataProcessor的速度是比较慢的(相对于dataIndexer),因此优化的重点应该放在dataFetchter和dataProcessor,当你觉得自己的代码已经优化得不能在优化的时候,可以开始考虑并发了。
一开始我考虑的是[python的多线程][2],然而效果跟单线程没太大区别,查资料才发现python的多线程其实是虚拟的多线程,由一个叫做GIL(Global Interpreter Lock,全局解释器锁)的东西来控制,并不能有效利用CPU。有网友说使用Jython 或 IronPython,可以得到真正的多线程(没有试)。 既然多线程不行,就用多进程,python提供了[multiprocessing][3]包,非常方便地开启子进程来完成从单进程到多进程的转换。
回到我们的问题,我们可以开启多个进程来进行dataFetcher和dataProcessor来匹配indexer的速度。还需要一个Controller开做控制器,协调三者的调度。在dataFetcher、dataProcessor和dataIndexer之间还需要有数据缓存区(缓冲队列),缓冲队列可以使用python自身的Queue模块,也可以用第三方的队列服务,如redis。
最终整个索引流程就变成了(有时间补图):
dataFetchter =》Q1=》dataProcessor=》Q2=》dataIndexer
其中dataFetchter ,dataProcessor是多个进程在工作,具体开启多少进程合适可根据实际情况而定,理想的状态是保证队列中的数据不会堆积太多,也不会为空。整个过程由Conntroller模块控制。

你可能感兴趣的:(python,搜索引擎,sphinx,coreseek,多进程)