Sto sviluppando un sito Web di articoli semplici in lingua portoghese brasiliana. La funzione di ricerca è basata su una ricerca full-text, ma non sta restituendo i risultati previsti.Impossibile ottenere risultati corretti dalla ricerca full-text di Postgre
L'ho fatto su postgresql. Ecco la tabella semplificata:
Artigos
-id
-title -- article title
-intro -- article introduction
-content -- article body
-publishdate -- date of launch
-artigosts -- this will work as our fts index.
Dopo aver creato il tavolo, mi sono imbattuto:
UPDATE artigos SET artigosts =
setweight(to_tsvector('pg_catalog.portuguese', coalesce(title,'')), 'A') ||
setweight(to_tsvector('pg_catalog.portuguese', coalesce(intro,'')), 'B') ||
setweight(to_tsvector('pg_catalog.portuguese', coalesce(content,'')), 'C');
CREATE INDEX artigosts_idx ON artigos USING gist (artigosts);
CREATE TRIGGER artigosts_tg
BEFORE INSERT OR UPDATE ON artigos
FOR EACH ROW EXECUTE PROCEDURE
tsvector_update_trigger('artigosts', 'pg_catalog.portuguese', 'title', 'intro', 'content');
Sì, ho intenzione di usare semplici weightning sulle ricerche. Realizzato un indice per accelerare, un trigger, così posso inserire e aggiornare senza preoccuparmi del remake dell'indice e così via.
Bene, per mia comprensione, è tutto a posto. Ma i risultati non lo sono. Un semplice esempio.
Diciamo che ho "... banco de dados ... no banco ..." come contenuto di un articolo. Quando faccio:
SELECT title, intro, content FROM artigos WHERE plainto_tsquery('banco de dados') @@ artigosts;
restituisce un insieme vuoto. Ho controllato la colonna ts_vector e ho visto i predicati 'banc' e 'dad'. Ma non riesco ancora a capire perché non restituisca la riga contenente l'articolo menzionato.
Qualcuno può portare una luce in questa domanda?
Stavo giocando con diverse configurazioni disponibili sul server. Penso che sia un problema da dizionari disponibili e interruzioni di parole.Qualcuno sa come mappare i caratteri superiori (come áéóôú) ai vettori? – Dave