Ricerca a testo completo con InnoDB


93

Sto sviluppando un'applicazione web ad alto volume, dove parte di essa è un database MySQL di post di discussione che dovrà crescere fino a 20 milioni di righe, senza problemi.

Inizialmente stavo pianificando di utilizzare MyISAM per le tabelle (per le funzionalità di ricerca full - text integrate ), ma il pensiero che l' intera tabella sia bloccata a causa di una singola operazione di scrittura mi fa impazzire. I blocchi a livello di riga hanno molto più senso (per non parlare degli altri vantaggi di velocità di InnoDB quando si ha a che fare con tabelle enormi). Quindi, per questo motivo, sono piuttosto determinato a utilizzare InnoDB.

Il problema è che ... InnoDB non ha funzionalità di ricerca full-text integrate.

Devo andare con un sistema di ricerca di terze parti? Come Lucene (c ++) / Sphinx ? Qualcuno di voi ninja del database ha qualche suggerimento / guida?Zoie di LinkedIn (con sede a Lucene) sembra l'opzione migliore al momento... essendo stato costruito attorno a funzionalità in tempo reale (che è piuttosto critico per la mia applicazione.) Sono un po 'riluttante a impegnarmi ma senza qualche intuizione ...

(FYI: sarà su EC2 con rig ad alta memoria, usando PHP per servire il frontend)


Risposte:


50

Posso garantire che il fulltext di MyISAM sia una cattiva opzione - anche lasciando da parte i vari problemi con le tabelle MyISAM in generale, ho visto la roba full text andare fuori dai binari e iniziare a corrompersi e mandare in crash MySQL regolarmente.

Un motore di ricerca dedicato sarà sicuramente l'opzione più flessibile qui: memorizza i dati dei post in MySQL / innodb, quindi esporta il testo nel tuo motore di ricerca. Puoi impostare una compilazione / pubblicazione periodica completa dell'indice abbastanza facilmente e aggiungere aggiornamenti dell'indice in tempo reale se ne senti la necessità e vuoi dedicare del tempo.

Lucene e Sphinx sono buone opzioni, così come Xapian , che è bello e leggero. Se segui la via Lucene, non dare per scontato che Clucene migliorerà, anche se preferiresti non lottare con Java, anche se non sono davvero qualificato per discutere i pro ei contro di nessuno dei due.


7
Solr (basato su Lucene) può scalare enormemente ed è molto potente e flessibile. Abbiamo impiegato Solr (in particolare l'edizione LucidWorks per Solr) e posso dire che è stata una grande vittoria. Anche Sphinx ha qualche seria promessa ma alla fine la sua mancanza di tipi di dati può essere preoccupante, almeno per la nostra applicazione. Sphinx è molto veloce e se si adatta alle tue esigenze è anche una scelta solida.
Cody Caughlan

Grazie mille a voi due; ottime risposte. Ho sfogliato i documenti di Solr e mi sembra un'ottima soluzione. Funziona anche su alcuni enormi siti Web, vedo. Penso che il biglietto sia Solr. Grazie ragazzi. Inoltre, è bello apprendere dei tuoi mal di testa MyISAM, Ian ... sarà bene tenerli a mente in futuro. In altri progetti, mi allontanerò dal provare a utilizzare la funzionalità fulltext.
brianreavis

11
Ti chiedevi cosa ha spinto Ian a dire "non dare per scontato che Clucene migliorerà"? come uno del core team di Clucene potrei non essere così obiettivo, ma a me sembra che il porting ottimizzato C ++ di qualsiasi libreria Java aumenterà le sue prestazioni fino alle stelle. Consiglierei a chiunque di non pubblicare commenti del genere senza dare almeno un'occhiata al prodotto che disonorano.
synhershko

4
Quando sbatti MyISAM, devi davvero essere più specifico. "Off the rails" è molto vago e potrebbe essere dovuto a un singolo bug nella build che stavi usando, probabilmente da allora risolto.
bobobobo

6
Ma cosa succede se non hai la possibilità di installare il software sul server, quali alternative esistono in questo caso?
acme


11

Dovresti passare un'ora e passare attraverso l'installazione e il test drive di Sphinx e Lucene. Verifica se uno dei due soddisfa le tue esigenze rispetto agli aggiornamenti dei dati.

Una delle cose che mi ha deluso di Sphinx è che non supporta molto bene gli inserti incrementali. Cioè, è molto costoso reindicizzare dopo un inserimento, così costoso che la loro soluzione consigliata è dividere i dati in righe più vecchie e immutabili e righe più nuove e volatili. Quindi ogni ricerca eseguita dalla tua app dovrebbe cercare due volte: una volta nell'indice più grande per le vecchie righe e anche nell'indice più piccolo per le righe recenti. Se questo non si integra con i tuoi schemi di utilizzo, questa Sfinge non è una buona soluzione (almeno non nella sua attuale implementazione).

Vorrei segnalare un'altra possibile soluzione che potresti prendere in considerazione: Google Ricerca Personalizzata . Se puoi applicare un po 'di SEO alla tua applicazione web, esternalizza la funzione di indicizzazione e ricerca a Google e incorpora un campo di testo di ricerca di Google nel tuo sito. Potrebbe essere il modo più economico e scalabile per rendere il tuo sito ricercabile.


Grazie Bill. Sì, la documentazione di Sphinx mi ha fatto esitare un po 'su come gestisce gli aggiornamenti dell'indice. Buono per averlo confermato. Quel tipo di sistema probabilmente si trasformerebbe in un incubo per me, immagino. Per quanto riguarda Google Ricerca Personalizzata, questa è un'opzione. Tuttavia, il mio problema principale con questo è solo l'indice non in tempo reale e la mancanza di personalizzazione. Lo stile dei risultati e l'estrazione di dati aggiuntivi saranno fondamentali per me. Grazie per essere intervenuto però --- le informazioni sulla Sfinge sono sicuramente utili!
brianreavis

3

Forse non dovresti chiudere FT di MySQL così velocemente. Craigslist lo usava .

La velocità di MySQL e la ricerca full-text hanno consentito a Craigslist di servire i propri utenti .. Craigslist utilizza MySQL per servire circa 50 milioni di ricerche al mese a una velocità massima di 60 ricerche al secondo. "

modificare

Come commentato di seguito, Craigslist sembra essere passato a Sphinx qualche tempo all'inizio del 2009.


L'articolo che ho collegato non menziona Sphinx e Nik non cita alcuna fonte che
affermi

Il PDF del case study sembra del 2004, momento in cui c'erano 50 milioni di ricerche al mese. La pagina di Sphinx riporta 50 milioni di ricerche al giorno , il che probabilmente spiega il motivo per cui sono passati a una soluzione di ricerca dedicata.
Halil Özgür

1

Sphinx, come fai notare, è molto carina per queste cose. Tutto il lavoro è nel file di configurazione. Assicurati che qualunque sia la tua tabella con le stringhe abbia una chiave ID intera univoca e dovresti stare bene.


0

prova questo

ROUND((LENGTH(text) - LENGTH(REPLACE(text, 'serchtext', ''))) / LENGTH('serchtext'),0)!=0

0

Dovresti dare un'occhiata a Sphinx. Vale la pena provare. L'indicizzazione è super veloce ed è distribuita. Dovresti dare un'occhiata a questo webminar (http://www.percona.com/webinars/2012-08-22-full-text-search-throwdown). Parla della ricerca e ha alcuni benchmark accurati. Potresti trovarlo utile.



0

Per chiunque sia bloccato su una versione precedente di MySQL / MariaDB (cioè utenti CentOS) in cui InnoDB non supporta le ricerche Fulltext, la mia soluzione quando si utilizzano le tabelle InnoDB era creare una tabella MyISAM separata per la cosa che volevo cercare.

Ad esempio, la mia tabella InnoDB principale era productscon varie chiavi e integrità referenziale. Ho quindi creato una semplice tabella MyISAM chiamata product_searchcontenente due campi, product_ide product_namedove quest'ultimo era impostato su un FULLTEXTindice. Entrambi i campi sono effettivamente una copia di ciò che è nella producttabella principale .

Quindi cerco nella tabella MyISAM usando il testo completo e faccio un inner join alla tabella InnoDB.

Il contenuto della tabella MyISAM può essere aggiornato tramite i trigger o il modello dell'applicazione.

Non lo consiglierei se hai più tabelle che richiedono il testo completo, ma per una singola tabella sembra una soluzione adeguata finché non puoi aggiornare.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.