5

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?

+0

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

risposta

4

Il motivo è probabilmente dovuto al fatto che il dizionario predefinito è impostato su inglese. Prova le seguenti query per determinare se questo è effettivamente il caso.

SELECT * FROM ts_debug('banco de dados'); 

Questa query mostrerà come il dizionario analizza la frase di ricerca. Dovrebbe fornire i lessemi "banco", "de" e "dado". Quindi quello che stai effettivamente cercando non esiste nell'indice e riceverai 0 risultati.

Ora provare questo:

SELECT * FROM ts_debug('portuguese', 'banco de dados'); 

Dovrebbe restituire i lessemi che esistono nell'indice, "banc" e "papà". In tal caso, puoi semplicemente modificare la query di ricerca per ottenere il risultato appropriato.

SELECT title, intro, content FROM artigos WHERE plainto_tsquery('portuguese', 'banco de dados') @@ artigosts; 
+0

Thx per la risposta. Sì, ho capito che il dizionario principale è inglese. E il conf portoghese per i dizionari, nonostante esistesse, fa schifo. Potrei ottenere i migliori risultati usando la configurazione SIMPLE. Il problema principale è l'uso di caratteri speciali, come ad esempio quelli usati pesantemente in portoghese. E alcuni lessemi non sono analizzati bene, ma la maggior parte dei lessemi viene analizzata correttamente, così da ora soddisfa parzialmente i miei bisogni. – Dave

+0

@Dave: non l'ho provato con una lingua diversa dall'inglese, ma si può sempre usare un dizionario ispell con una riserva sullo snowballer. I dizionari portoghesi sono disponibili online: http://lasr.cs.ucla.edu/geoff/ispell-dictionaries.html#Portuguese-dicts – thetaiko

+0

Thx per la risposta rapida, ma vorrei poter modificare queste impostazioni sul mio host. Sfortunatamente cambiare le proprietà di dict, fallback, file e così via non è un'opzione per me su quel particolare server. Ma ancora, grazie per i suggerimenti. – Dave

1

Probabilmente è tardi per te. E non ho abbastanza reputazioni per aggiungere un semplice commento ...

Per quanto riguarda i caratteri speciali li ho annullati prima di trasformarli in tsvector.

SELECT to_tsvector('simple',unaccent('banco de dados áéóíúçãõ')) 

in modo da ottenere:

"'aeoiucao':4 'banco':1 'dados':3 'de':2" 

È necessario:

CREATE EXTENSION unaccent; 

... come utente postgres. E sicuramente, è necessario annullare la tua tsquery anche

Problemi correlati