Come indicato nella documentazione (e notato da AJcodez), esiste una soluzione nella creazione di una colonna dedicata per l'indice tsvector. Quindi definire un trigger che cattura gli inserimenti a URL indicizzare correttamente:
CREATE test_url (url varchar NOT NULL, url_tsvector tsvector NOT NULL);
Questo metodo sarà transorm tutti i caratteri non alfabetici in unico spazio e girare la stringa in un tsvector:
CREATE OR REPLACE FUNCTION generate_url_tsvector(varchar)
RETURNS tsvector
LANGUAGE sql
AS $_$
SELECT to_tsvector(regexp_replace($1, '[^\w]+', ' ', 'gi'));
$_$;
Ora creare un trigger che chiama questa funzione:
CREATE OR REPLACE FUNCTION before_insert_test_url()
RETURNS TRIGGER
LANGUAGE plpgsql AS $_$
BEGIN;
NEW.url_tsvector := generate_url_tsvector(NEW.url);
RETURN NEW;
END;
$_$
;
CREATE TRIGGER before_insert_test_url_trig
BEFORE INSERT ON test_url
FOR EACH ROW EXECUTE PROCEDURE before_insert_test_url();
Ora, quando vengono inseriti URL, il campo `url_tsvectorè verrà popolato automaticamente.
INSERT INTO test_url (url) VALUES ('http://www.google.fr');
TABLE test_url;
id url url_tsvector
2 http://www.google.fr 'fr':4 'googl':3 'http':1 'www':2
(1 row)
Per la ricerca FT sugli URL è sufficiente eseguire una query su questo campo.
SELECT * FROM test_url WHERE url_tsvector @@ 'google'::tsquery;
come un work-around si potrebbe avere un'altra colonna/attributo con l'url e separatori di parole riconosciute, e la ricerca contro che invece – AJcodez