Ricerca fulltext con InnoDB

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

Inizialmente pensavo di usare MyISAM per le tabelle (per le funzionalità di ricerca fulltext incorporate ), ma il pensiero che l’ intera tabella fosse bloccata a causa di una singola operazione di scrittura mi fa scattare. Le serrature a livello di riga hanno molto più senso (per non parlare degli altri vantaggi di InnoDB quando si tratta di tavoli enormi). Quindi, per questo motivo, sono abbastanza determinato ad usare InnoDB.

Il problema è … InnoDB non ha funzionalità di ricerca fulltext incorporate.

Devo andare con un sistema di ricerca di terze parti? Come Lucene (c ++) / Sfinge ? Qualcuno di voi ninja del database ha qualche suggerimento / guida? Zoie di LinkedIn (basato su Lucene) sembra l’opzione migliore al momento … essendo stato costruito attorno a funzionalità in tempo reale (il che è piuttosto importante per la mia applicazione). Sono un po ‘titubante nel commettere ancora senza un po’ di intuizione …

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

Posso garantire che il testo completo di MyISAM sia una ctriggers opzione – anche lasciando da parte i vari problemi con le tabelle di MyISAM in generale, ho visto le cose di testo completo uscire dai binari e iniziare a corrompersi e danneggiare 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. È ansible impostare un indice completo periodico di compilazione / pubblicazione abbastanza facilmente e aggiungere aggiornamenti dell’indice in tempo reale se si sente il bisogno e si desidera trascorrere il tempo.

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

Insieme alla distriggerszione generale di MyISAM, la ricerca full-text (FTS) di InnoDB è finalmente disponibile nella versione 5.6.4 di MySQL.

Da http://dev.mysql.com/doc/refman/5.6/en/innodb-table-and-index.html#innodb-fulltext-index :

Questi indici sono rappresentati fisicamente come intere tabelle InnoDB, su cui si basano le parole chiave SQL come la clausola FULLTEXT dell’istruzione CREATE INDEX, la syntax MATCH () … AGAINST in un’istruzione SELECT e l’istruzione OPTIMIZE TABLE.

Mentre altri motori hanno molte caratteristiche diverse, questo è InnoDB, quindi è nativo (il che significa che c’è un percorso di aggiornamento), e questo lo rende un’opzione utile.

Dovresti passare un’ora e passare attraverso l’installazione e il test-drive di Sphinx e Lucene. Verifica se soddisfa le tue esigenze, in relazione 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 inserto, così costoso che la loro soluzione raccomandata è quella di dividere i dati in vecchie, immutabili righe e nuove, volatili righe. Pertanto, ogni ricerca eseguita dalla tua app dovrebbe essere eseguita due volte: una volta sull’indice più grande per le vecchie righe e anche sull’indice più piccolo per le righe recenti. Se ciò non si integra con i tuoi schemi di utilizzo, questa Sfinge non è una buona soluzione (almeno non nella sua attuale implementazione).

Vorrei sottolineare un’altra ansible soluzione che potresti prendere in considerazione: Google Ricerca personalizzata . Se puoi applicare un po ‘di SEO alla tua applicazione web, estrai la funzione di indicizzazione e ricerca a Google e incorpora un campo di ricerca di Google nel tuo sito. Potrebbe essere il modo più economico e scalabile per rendere il tuo sito ricercabile.

Forse non dovresti licenziare MySQL’s FT così velocemente. Craigslist lo usava .

La velocità e la ricerca full text di MySQL hanno permesso a craigslist di servire i propri utenti. Craigslist usa MySQL per servire circa 50 milioni di ricerche al mese a un massimo di 60 ricerche al secondo. ”

modificare

Come commentato di seguito, Craigslist sembra essere passato a Sfinge qualche volta all’inizio del 2009.

La Sfinge, come lei sottolinea, è molto carina per questa roba. Tutto il lavoro è nel file di configurazione. Assicurati che qualunque sia il tuo tavolo con le stringhe abbia qualche chiave univoco integer, e dovresti stare bene.

prova questo

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

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

Se tutto il resto fallisce, c’è sempre soundex_match , che purtroppo non è veramente veloce e preciso