Syndfony与Zend Lucene及相关模型(带外键)

时间:2010-10-05 13:40:35

标签: php zend-framework symfony1 indexing lucene

当我意识到Zend Lucene实现的一个主要缺点时,我正在使用Symfony 1.4和Doctrine开发一个应用程序。

我有一个名为Publication的模型,它与其他一些模型(主题,流派,语言,作者等)相关(通过外键关系),并且在添加新文档时我会得到它们的名字。索引(使用Jobeet教程方式),以便我可以搜索具有给定主题,流派,语言,作者等的出版物...问题是,如果由于某种原因我决定改变其中一个相关模型的名称Zend Lucene索引不会更新。

我能想出的唯一两个解决方案是:

  1. 定期重新索引所有出版物,以保证对相关模型所做的任何更改都会在索引上更新(但此解决方案不允许实时更新索引)

    < / LI>
  2. 获取与给定模型相关的所有出版物,并在更新后重新索引它们(使用save(),postSave(),postUpdate()或者在Doctrine上可以提出的任何内容) 。 - &GT;这个解决方案看起来很棒......它只会重建与更新模型链接的出版物的索引吗?好吧,如果你有一千个(1000)的出版物链接到它将需要几分钟的时间来更新(是的,我测试了它),在用户表单上它会超时,因为它需要超过30秒(即使它不是'让用户在屏幕上看几分钟等待页面完成加载是不好的。

  3. 所以我想知道的是,还有另一种解决方案吗?有没有办法根据相关模型的变化动态更新索引而不会挂掉整个pahe?也许把任务放在后台运行或什么的?有这样的方式吗?

    如果用Lucene无法做到这一点,有没有办法使用MySQL(带InnoDB表)的全文搜索,而不使用没有这种缺点的Zend Lucene?如果有这样的工具,我会重构我的代码以适应不同的库。

    你可以帮我解决这个问题吗?提前谢谢!

2 个答案:

答案 0 :(得分:0)

无法更新Lucene文档。您只能删除匹配,然后重新添加。 因此,我的原始解决方案无效。

我正在寻找替代方案,有一个引起我注意的: http://www.sphinxsearch.com/

似乎Sphinx在索引方面速度非常快,但执行搜索速度较慢。可能值得一看。

从我读过的内容来看,Lucene的PHP实现并不是很快,这是一种正常行为。有一些方法可以提高索引大量数据的速度,主要是为了让Lucene在转储文件之前将更大的文档大小写入内存,这主要涉及增加RAM。

答案 1 :(得分:0)

嗯......我正在回答我的自我。在考虑了一段时间后,我以妥协解决方案结束了。

在我的模型上,我已经与一个只用于存储有关出版物的元信息的表的一对一关系,所以我最终插入了一个名为reindex的新列(即“布尔”)。这样每次我更新与出版物相关的实体(生产中很少发生的事情,但我想为此做好准备),它会将与之相关的每个出版物标记为需要重新索引。我有一个可以在cron作业或任务计划程序上运行的任务,它只会重新索引标记为需要它的出版物。这样我可以将此任务设置为每周运行几次,以保持索引一致。

这不是一个完美的解决方案,但我只能使用PHP和Zend Lucene。