Cerca più tabelle

5

Ho sviluppato un'applicazione web che viene utilizzata principalmente per l'archiviazione di tutti i tipi di materiale testuale (documenti, riferimenti a articoli, libri, riviste, ecc.). Nel mio sistema può esserci un determinato numero di tabelle di archivio, ognuna con un proprio schema. Lo schema può essere modificato da un moderatore tramite l'applicazione (immagina qualcosa di simile a una versione davvero scadente di phpMyAdmin).

Gli utenti possono cercare qualsiasi cosa da tutte le tabelle. Utilizzando gli indici FULLTEXT insieme alla ricerca della sottostringa (campi che non supportano l'indicizzazione FULLTEXT) lo script inserisce i risultati di una ricerca in una singola tabella e ordinando questi risultati per la misura della similarità posso facilmente restituire i risultati impaginati.

Tuttavia, questo approccio ha alcuni problemi:

  • la ricerca della sottostringa può contare solo sui risultati esatti
  • la regola del 50% si applica a tutte le tabelle separatamente e quindi , mysql potrebbe non restituire corrispondenze importanti o eliminare ingenuamente parole comuni.
  • è piuttosto costoso in termini di numeri di query e tempi di esecuzione (non è un problema adesso dato che non ci sono ancora molti dati nelle tabelle).
  • i dati normalizzati non vengono nemmeno cercati (ho tabelle diverse per categorie, lingue e attacchi file).

La mia soluzione pianificata crea una singola tabella con colonne simili a

id, table_id, row_id, data

Ogni volta che una nuova riga viene creata / modificata / eliminata in una qualsiasi delle tabelle di dati, anche questa tabella centrale viene aggiornata con la colonna data contenente una concatenazione di tutti i campi di una riga. Potrei quindi creare un singolo indice per Sphinx e usarlo per fare ricerche invece.

Esistono soluzioni o best practice più efficienti su come affrontarlo? Grazie.

    
posta gilden 14.09.2011 - 22:30
fonte

1 risposta

2

Perché non lasciare che il motore di ricerca di testo come lucene o sphinx fai tutto il lavoro? Io uso Lucene e ho trovato che è molto bravo a cercare più tabelle e campi per qualsiasi cosa tu abbia impostato come target.

Non dici ciò che il tuo front-end web è scritto ma entrambi questi strumenti possono essere utilizzati con la maggior parte delle lingue.

Aggiungerai un sacco di codice da conservare nei trigger che guardano creati / modificati / cancellati in tutte le tabelle. Non sarebbe più facile aggiungere l'opzione per gli amministratori per contrassegnare una colonna come "da cercare". Quindi scrivere il codice per aggiungere questa colonna ai campi indicizzati?

Vedo che Sphinx ha "costruzione dell'indice offline e aggiornamenti incrementali al volo" che sembrano consentirvi di aggiungere un campo, ricostruire l'indice offline e quindi portare il nuovo indice in alto.

    
risposta data 19.09.2011 - 04:34
fonte

Leggi altre domande sui tag