Modifica, 2016: Perché non entrambi?
Se sei interessato a Postgres vs. Lucene, perché non entrambi? Dai un'occhiata a ZomboDB estensione per Postgres, che integra Elasticsearch come tipo di indice di prima classe. È ancora un progetto abbastanza precoce, ma mi sembra davvero promettente.
(Tecnicamente non disponibile su Heroku, ma vale comunque la pena dare un'occhiata.)
Divulgazione:sono un cofondatore di Websolr e Bonsai Componenti aggiuntivi di Heroku, quindi la mia prospettiva è un po' sbilanciata verso Lucene.
La mia lettura sulla ricerca full-text di Postgres è che è piuttosto solida per casi d'uso semplici, ma ci sono una serie di ragioni per cui Lucene (e quindi Solr ed ElasticSearch) è superiore sia in termini di prestazioni che di funzionalità.
Per cominciare, jpountz fornisce una risposta tecnica davvero eccellente alla domanda, Perché Solr è molto più veloce di Postgres? Vale la pena leggere un paio di volte per digerirlo davvero.
Ho anche commentato un recente episodio di RailsCast confrontando vantaggi e svantaggi relativi della ricerca full-text di Postgres rispetto a Solr. Permettetemi di ricapitolare qui:
Vantaggi pragmatici per Postgres
- Riutilizza un servizio esistente che stai già utilizzando invece di configurare e mantenere (o pagare) qualcos'altro.
- Di gran lunga superiore al incredibilmente lento SQL
LIKE
operatore. - Meno fatica a mantenere sincronizzati i dati poiché sono tutti nello stesso database: nessuna integrazione a livello di applicazione con alcune API di servizi dati esterni.
Vantaggi di Solr (o ElasticSearch)
Al di sopra della mia testa, senza un ordine particolare...
- Ridimensiona il carico di indicizzazione e ricerca separatamente dal normale carico di database.
- Analisi dei termini più flessibile per cose come normalizzazione dell'accento, stemming linguistico, N-grammi, rimozione del markup... Altre funzioni interessanti come il controllo ortografico, l'estrazione di "contenuti avanzati" (ad es. PDF e Word)...
- Solr/Lucene può fare tutto sull'Ricerca full-text di Postgres TODO list bene.
- Classificazione della pertinenza dei termini molto migliore e più veloce, personalizzabile in modo efficiente al momento della ricerca.
- Probabilmente prestazioni di ricerca più veloci per termini comuni o query complicate.
- Prestazioni di indicizzazione probabilmente più efficienti di Postgres.
- Migliore tolleranza al cambiamento nel tuo modello di dati disaccoppiando l'indicizzazione dal tuo datastore principale
Chiaramente penso che un motore di ricerca dedicato basato su Lucene sia l'opzione migliore qui. Fondamentalmente, puoi pensare a Lucene come al repository open source de facto delle competenze di ricerca.
Ma se la tua unica altra opzione è il LIKE
operatore, quindi la ricerca full-text di Postgres è decisamente vincente.