Symfony con Zend Lucene e templates correlati (con chiavi esterne)

Bene, stavo sviluppando un'applicazione che utilizza Symfony 1.4 e Doctrine quando ho realizzato uno svantaggio principale sulla mia implementazione di Zend Lucene.

Ho un model chiamato Pubblicazione che è correlato (tramite relazioni con le estranee relazioni) con pochi altri templates (argomenti, generi, lingue, autori, ecc.) E sto diventando loro nomi quando aggiungo un nuovo documento all'indice ( usando il modo tutorial di Jobeet) in modo da poter cercare pubblicazioni con un determinato argomento, genere, lingua, autore, ecc … Il problema è se per qualche ragione decido di modificare il nome di uno di quei templates correlati, la Zend Lucene l'indice non verrà aggiornato.

Le uniche due soluzioni che ho potuto inventare erano:

  1. Reindicizza regolarmente tutte le pubblicazioni per garantire che eventuali modifiche apportte ai templates correlati vengano aggiornate sull'indice (tuttavia questa soluzione non consente l'aggiornamento dell'indice in tempo reale)

  2. Ottieni tutte le pubblicazioni relative a un determinato model e reindicizzale dopo l'aggiornamento (utilizzando save (), postSave (), postUpdate () o qualsiasi altra cosa tu possa inventare su Doctrine). -> Questa soluzione sembrava ottima … ricostruirà solo l'indice per le pubblicazioni che sono collegate al model aggiornato giusto? Bene, se hai qualcosa come mille (1000) pubblicazioni collegate ad esso ci vorrà qualche minuto per aggiornarlo (sì l'ho provato) e su un module utente verrà timeout perché ci vogliono più di 30 secondi (e anche se non lo fa t sarebbe male avere un utente che guarda lo schermo per qualche minuto in attesa che la pagina finisca di caricarsi).

Quindi quello che voglio sapere è se c'è un'altra soluzione? C'è un modo per aggiornare un indice in tempo reale sulla base di una modifica su un model correlato senza appendere l'integer pahe? Magari mettendo l'attività in esecuzione sullo background o qualcosa del genere? C'è un modo?

Se non c'è modo di farlo con Lucene, c'è un modo per usare la ricerca full-text con MySQL (con tabelle InnoDB) senza usare Zend Lucene che non ha un tale svantaggio? Se c'è un tale strumento, mi piacerebbe refactoring il mio codice per ospitare una libreria diversa.

Potresti per favore aiutarmi con questo? Grazie in anticipo!

Un documento Lucene non può essere aggiornato. Puoi eliminare solo gli hit e riaggiungerli nuovamente. Per questo motivo, la mia soluzione originale non è valida.

Stavo guardando le alternative per te, e ce n'è una che ha attirato la mia attenzione: http://www.sphinxsearch.com/

Sembra che Sphinx sia molto veloce nell'indexing, ma più lento nell'eseguire ricerche. Potrebbe essere qualcosa che vale la pena dare un'occhiata.

Da quello che ho letto, l'implementazione di Lucene in PHP non è molto veloce, e questo è normale come un comportmento. Esistono modi per migliorare la velocità di indexing di grandi quantità di dati, che riguardano principalmente l'aumento della RAM per consentire a Lucene di scrivere in formato di documenti di size maggiori prima di scaricare i file.

Bene … sto rispondendo da solo. Dopo averci pensato per un po 'di tempo, sono finito con una soluzione di compromiss.

Sul mio model ho già una relazione uno-a-uno con una tabella che viene utilizzata solo per l'archiviazione delle meta-informazioni su una pubblicazione, quindi ho finito per inserire una nuova colonna chiamata reindex (che è un "boolean"). In questo modo each volta che aggiorno un'entity framework; legata a una pubblicazione (qualcosa che in produzione succederà molto di rado ma voglio essere preparato per questo) segnerà each pubblicazione correlata ad essa come bisognosa di reindexing. Ho un'attività che può essere eseguita su cron job o Task Scheduler che reindicherà solo le pubblicazioni contrassegnate come necessarie. In questo modo, posso impostare questa attività in modo che venga eseguita alcune volte alla settimana alle ore tarde per mantenere l'indice coerente.

Non è una soluzione perfetta ma è il meglio che riesco a trovare usando solo PHP e Zend Lucene.