【问题标题】:Symfony with Zend Lucene and related models (with foreign keys)带有 Zend Lucene 和相关模型的 Symfony(带有外键)
【发布时间】:2011-04-21 07:40:29
【问题描述】:

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

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

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

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

  2. 获取与给定模型相关的所有出版物,并在更新后重新索引它们(使用 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


【解决方案1】:

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

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

Sphinx 的索引速度似乎非常快,但执行搜索的速度较慢。可能是值得一看的东西。

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

【讨论】:

  • 我该怎么做。据我所知,我不能只更新 Zend Lucene 索引的“文档”中的一个术语。如果这样的事情是可能的,我很乐意尝试。知道怎么做吗?
  • 你是对的。我只是在想它,但如果可能的话,我没有抬头。无法更新 Lucene 文档。
  • 好吧,我最终得到了我在下面写的解决方案。它并不完美,但我觉得它“足够好”。但是,如果 Lucene 能够在仅更新单个文档术语方面有所改进,甚至可能提供某种实时索引,那将是非常酷的。
  • 如上所述,sphinx 的搜索速度比 zend lucene 快得多。索引和搜索速度都快了几个数量级。
【解决方案2】:

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

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

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2017-12-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-04
    • 2011-12-18
    • 1970-01-01
    • 2012-08-03
    • 2015-04-16
    相关资源
    最近更新 更多