2012-05-16 10 views
7

Voglio fare una ricerca di testo come google suggestions.suggerisce come google con trigrams postgresql e ricerca full text

Sto usando PostgreSQL a causa del magico Postgis.

Stavo pensando di utilizzare FTS, ma ho visto che non si poteva cercare partial words, così ho trovato this question, e ho visto come trigrams opere.

Il problema principale è che il motore di ricerca su cui sto lavorando è per la lingua spagnola. FTS ha funzionato bene con lo stemming e dictionaries (sinonimi, errori di ortografia), UTF e così via. I trigram funzionano bene per parole parziali, ma funzionano solo per ASCII e (ovviamente) non usano cose come dizionari.

Stavo pensando se c'è un modo in cui le cose migliori di entrambi potrebbero essere utilizzate.

È possibile rendere la ricerca e i trigram di testo completo per lavorare insieme in PGSQL?

risposta

3

È possibile farlo in Postgres e non è necessario Lucene.

È possibile citare frasi in tsquery o tsvector come il seguente. È possibile aggiungere un :* dopo un periodo tsquery di fare una ricerca di prefisso:

select 
'''new york city'''::tsvector @@ '''new yo'':*'::tsquery, --true 
'''new york times'''::tsvector @@ '''new yo'':*'::tsquery, --true 
'''new york'''::tsvector  @@ '''new yo'':*'::tsquery, --true 
'''new'''::tsvector    @@ '''new yo'':*'::tsquery, --false 
'new'::tsvector     @@ '''new yo'':*'::tsquery, --false 
'new york'::tsvector   @@ '''new yo'':*'::tsquery --false 

Il problema principale è che to_tsvector() e [plain]to_tsquery() metterà a nudo le vostre citazioni. Puoi scrivere le tue versioni che non lo fanno (non è così difficile), o fare qualche post-processing dopo di loro per costruire il tuo termine n-grammi.

Le virgolette singole sopra sono solo fughe. select $$ i heart 'new york city' $$::tsvector; è equivalente.

+0

Eeeek !!! puoi aggiungere un riferimento alla documentazione riguardante questa tripla citazione? – jperelli

+1

la citazione tripla è in realtà normale SQL, sto solo scappando da una singola citazione con un'altra. I documenti lo menzionano qui: http://www.postgresql.org/docs/9.3/static/textsearch-controls.html –

2

Suggerirei di dare un'occhiata a Lucene. Può essere integrato nativamente in Java, facilmente in .NET o usando SOLR e servizi web in php.

Ha ottime funzionalità per le ricerche di testo libero, classificare i termini fuori dalla scatola, supporto per lingue diverse utilizzando diversi Analysers (collegamento per quello spagnolo).

Ultimo ma non meno importante, è anche estremamente veloce (per grandi volumi, ad esempio indice 4Gb ~ 5 000 000 righe in un DB, è molto più veloce di un database Postgres).

+3

Vado con una soluzione simile, usando elasticsearch, ma non posso accettare, perché non risponde alla domanda (nel caso qualcuno arrivi qui cercando la risposta). Grazie! – jperelli

Problemi correlati