2009-03-05 7 views
9

OK Ho un database MySQL che sembra qualcosa di simileIl testo completo cerca la risposta?

ID - un int e l'ID univoco del registrato

Titolo - Il nome dell'elemento

Descrizione - La descrizione degli articoli

Voglio cercare sia il titolo che la descrizione delle parole chiave, attualmente sto usando.

SELECT * Da 'voce' in cui titolo come chiave%%

E questo funziona e come non c'è molto nel database, come invece la ricerca di “questa chiave” non trovare “ciò che chiave "Voglio migliorare il motore di ricerca del sito, e magari aggiungere un qualche tipo di sistema di classificazione (ma è passato molto tempo).

Quindi, per la domanda, ho sentito parlare di una cosa chiamata "ricerca a testo integrale", è (per quanto posso dire) una graffetta del design del database, ma essendo una Newby di questo argomento non ne so nulla ...

1) Pensi che sarebbe utile?

E un ulteriore Questron ...

2) Cosa posso letto di progettazione di database progettazione del motore/di ricerca che mi punto nella giusta direzione.

Se è rilevante del sito è attualmente scritto in dritto PHP (cioè senza un quadro) (thro il pensiero di convertirlo in Ruby on Rails ha attraversato la mia mente)

aggiornamento

Grazie tutto, vado per la ricerca a testo integrale. E per chi lo trova in seguito, ho trovato un buon tutorial anche nella ricerca di testo completo.

risposta

9

Il problema con la ricerca del tipo '% keyword%' è che non esiste un modo per eseguire ricerche in modo efficiente su una tabella normale, anche se si crea un indice su quella colonna. Pensa a come sembreresti quella stringa nella rubrica. Non c'è in realtà alcun modo per ottimizzarlo - è necessario eseguire la scansione dell'intera rubrica - e questo è ciò che MySQL fa, una scansione completa della tabella.

Se si modifica la ricerca in "parola chiave%" e si utilizza un indice, è possibile ottenere una ricerca molto veloce. Sembra che questo non è quello che vuoi, però.

Quindi, con questo in mente, ho usato l'indicizzazione full-text/ricerca di un po ', e qui sono alcuni pro e contro:

Pro

  • molto veloci
  • restituisce i risultati ordinati per rilevanza (per impostazione predefinita, sebbene sia possibile utilizzare qualsiasi ordinamento)
  • Le parole di arresto possono essere utilizzate.

Contro

  • funziona solo con tabelle MyISAM
  • Parole che sono troppo brevi sono ignorati (minimo di default è 4 lettere)
  • richiede SQL diversa in cui la clausola, in modo da è necessario modificare le query esistenti.
  • non corrisponde a stringhe parziali (per esempio, 'parola' non corrisponde 'parola chiave', solo 'parola')

Here is some good documentation on full-text searching.

Un'altra opzione consiste nell'utilizzare un sistema di ricerca come Sphinx. Può essere estremamente veloce e flessibile. È ottimizzato per la ricerca e si integra bene con MySQL.

+0

Grazie, ho intenzione di usare qualcosa come Sfinge, ma ad essere onesti, a meno che non ci voglia molto tempo, preferisco costruirlo da solo in questo modo capisco come funziona. –

+0

ci stiamo avvicinando all'implementazione della Sfinge in una delle nostre applicazioni. facciamo pesanti ricerche su una tonnellata di dati. per un po 'abbiamo utilizzato la ricerca di testo completo, ma era necessario passare a innodb per le transazioni. Ma il testo completo era facile da implementare e molto veloce. – jonstjohn

1

Si potrebbe anche considerare Zend_Lucene. È leggermente più facile da integrare rispetto a Sphinx, perché è puro PHP.

+0

non lo consiglierei perché è molto lento – deresh

2

Direi che MySQL fulltext è sufficiente per le tue esigenze, ma vale la pena notare che il supporto integrato non scala molto bene. Per i documenti di dimensioni medie inizia a diventare inutilizzabile per dimensioni di tabelle di poche centinaia di migliaia di righe. Se pensi che questo potrebbe diventare un problema in più dovresti probabilmente guardare in Sphinx già. Sta diventando lo standard defacto per gli utenti di MySQL, anche se personalmente preferisco implementare la mia soluzione utilizzando java lucene. :)

Inoltre, vorrei ricordare che la ricerca a testo integrale è fondamentalmente diversa dallo standard LIKE '% keyword%' - search. Diversamente dall'indicizzazione full-text della ricerca LIKE, è possibile cercare più parole chiave che non devono apparire l'una accanto all'altra. I motori di ricerca standard come Google sono motori di ricerca full text, per esempio.