2010-10-05 64 views
1

當我意識到我的Zend Lucene實現的一個主要缺點時,我正在開發一個應用程序使用Symfony 1.4和Doctrine。與Zend Lucene和相關模型(與外鍵)Symfony

我有一個叫做出版物的模型,與其他一些模型(主題,流派,語言,作者等)相關(通過外鍵關係),我在添加新文檔時得到它們的名稱到索引(使用Jobeet教程方式),以便我可以搜索具有給定主題,流派,語言,作者等的出版物......問題是如果由於某種原因,我決定更改其中一個相關名稱模型的Zend Lucene索引不會得到更新。

僅有的兩個解決方案,我能想出是:

  1. 重建索引所有的定期出版物,以保證對相關模型所做的任何更改大幹快上的索引更新(但是這個解決方案沒有按」允許索引實時更新)

  2. 獲取與給定模型相關的所有出版物,並在更新後重新編制索引(使用save(),postSave(),postUpdate()或者你可以在Doctrine上找到的東西)。 - >這個解決方案看起來很棒......它只會重建鏈接到更新模型的出版物的索引嗎?那麼,如果你有幾千(1000)個與其鏈接的出版物需要幾分鐘更新(是的,我測試了它),並且在用戶表單上,它會超時,因爲它需要超過30秒(並且即使它不是'如果用戶在屏幕上等待頁面完成加載幾分鐘,這將會很糟糕)。

所以我想知道的是,如果有另一種解決方案?有沒有辦法根據相關模型的變化即時更新索引而無需掛上整個pahe?也許把任務放在後臺運行?有沒有這樣的方式?

如果沒有辦法使用Lucene做,這是有什麼辦法可以使用全文搜索與MySQL(和InnoDB表),而不使用Zend Lucene的不具有這樣的缺點?如果有這樣一個工具,我會鄙視重構我的代碼以適應不同的庫。

你能幫我解決嗎?提前致謝!

+0

據我所知,Zend_Search_Lucene不再更新。當你遇到大型索引(10k +文檔)時,它的表現也很糟糕。請記住,Zend Lucene是一個真正的Lucene的php端口。獅身人面像或solr(建立在原始lucene庫上的solr)將大大提高性能並提供更好的結果。 – benlumley 2010-10-10 14:35:15

+0

就我所知,Zend_Search_Lucene仍然與Zend Framework的其餘部分一起維護。但是我同意Apache所做的原始Java實現更快(主要是因爲即使它不是機器代碼,Java比在運行時解釋的PHP更快)。 另外Solr是Lucene的獨立服務器,因此它比在自己的應用程序中運行它更快。 Finnaly Sphinx是一個用C/C++編寫的無關項目,使其非常快速(並且可以使用綁定和其他語言使用)。 – petersaints 2010-10-15 00:08:30

回答

0

嗯......我正在回答我的自我。在思考了一段時間之後,我以妥協解決方案結束了。

在我的模型中,我已經有一個表只用於存儲關於出版物的元信息的表的一對一關係,所以我最終插入了一個名爲reindex的新列(這是一個「布爾」) 。這樣每次我更新一個與出版物有關的實體(在生產中很少發生的事情,但我想爲它做好準備),它會將每一個與它相關的出版物標記爲需要重新編排。比我可以在cron作業或任務計劃程序上運行的任務只會重新標記標記爲需要它的發佈。通過這種方式,我可以將此任務設置爲在晚上每週運行幾次,以保持索引一致。

這不是一個完美的解決方案,但是我可以使用PHP和Zend Lucene。

0

Lucene Document無法更新。您只能刪除匹配,並將其重新添加。 因此,我的原始解決方案無效。

我一直在尋找適合你的選擇,並有一個吸引我的眼球: http://www.sphinxsearch.com/

看來,獅身人面像在索引速度非常快,但速度慢執行搜索。可能值得一看。

從我一直在閱讀的內容來看,Lucene的PHP實現並不是很快,這是行爲正常的。有很多方法可以提高索引大量數據的速度,這主要涉及增加RAM,以便讓Lucene在傾出文件之前將更大的文檔大小寫入內存。

+0

我該怎麼做。據我所知,我不僅可以在Zend Lucene上索引的「文檔」中更新一個術語。如果這樣的事情是可能的,我很樂意嘗試。任何想法如何做到這一點? – petersaints 2010-10-05 14:38:07

+0

你說得對。我只是在考慮這個問題,但如果可能的話,並沒有查找。 Lucene文檔無法更新。 – jgallant 2010-10-05 16:16:49

+0

那麼我結束了我在下面寫的解決方案。這並不完美,但我覺得它「足夠好」。然而,如果Lucene在更新文檔的單個詞條方面可能會稍微改進一點,甚至可能提供某種實時索引,那將會非常酷。 – petersaints 2010-10-06 16:10:48