【发布时间】:2011-04-21 07:40:29
【问题描述】:
当我意识到我的 Zend Lucene 实现存在一个重大缺陷时,我正在使用 Symfony 1.4 和 Doctrine 开发一个应用程序。
我有一个名为 Publication 的模型,它与其他一些模型(主题、流派、语言、作者等)相关(通过外键关系),并且在将新文档添加到索引(使用 Jobeet 教程方式),以便我可以搜索具有给定主题、流派、语言、作者等的出版物...问题是如果出于某种原因我决定更改其中一个相关模型的名称Zend Lucene 索引不会得到更新。
我能想到的唯一两个解决方案是:
-
定期重新索引所有出版物,以保证对相关模型所做的任何更改都会在索引上更新(但是此解决方案不允许实时更新索引)
获取与给定模型相关的所有出版物,并在更新后重新索引它们(使用 save()、postSave()、postUpdate() 或您可以在 Doctrine 上提出的任何内容) . --> 这个解决方案看起来很棒......它只会为链接到更新模型的出版物重建索引,对吗?好吧,如果你有类似一千(1000)份出版物链接到它,将需要几分钟来更新(是的,我测试过)并且在用户表单上它会超时,因为它需要超过 30 秒(即使它没有'让用户盯着屏幕几分钟等待页面完成加载会很糟糕)。
所以我想知道是否还有其他解决方案?有没有办法根据相关模型的更改即时更新索引而不挂起整个 pahe?也许将任务在后台运行或其他什么?有没有这样的方法?
如果没有办法用 Lucene 做到这一点,有没有办法在不使用没有这样缺点的 Zend Lucene 的情况下使用 MySQL 的全文搜索(使用 InnoDB 表)?如果有这样的工具,我很乐意重构我的代码以适应不同的库。
你能帮我解决这个问题吗?提前致谢!
【问题讨论】:
-
据我所知,Zend_Search_Lucene 不再更新。当您获得大索引(10k + 文档)时,它的性能也非常糟糕。请记住,Zend Lucene 是真正 Lucene 的 php 端口。 Sphinx 或 solr(基于原始 lucene 库构建的 solr)性能会大大提高并提供更好的结果。
-
Zend_Search_Lucene,据我所知,仍然与 Zend 框架的其余部分一起维护。但是我同意 Apache 的原始 Java 实现更快(主要是因为即使它不是机器代码,Java 也比在运行时解释的 PHP 更快)。此外,Solr 是 Lucene 的独立服务器,因此它比在您自己的应用程序中运行它更快。 finnaly Sphinx 是一个用 C/C++ 编写的不相关的项目,使其速度非常快(并且可以使用绑定和其他东西在其他语言上使用)。
标签: php zend-framework symfony1 indexing lucene