Separadores de palavras para pesquisa de texto completo do Postgres com Rails

9

Estou usando pg_search para pesquisar alguns textos em meu modelo. Entre outros atributos, tenho um campo url .

Unfortuantelly O Postgres parece não identificar / e . como separadores de palavras, portanto, não consigo pesquisar no url .

Exemplo: a pesquisa por test no link não produz resultados.

Existe uma maneira de corrigir esse problema, talvez usando outra gem ou algum SQL embutido?

    
por mihai 30.12.2012 в 19:11
fonte

2 respostas

0

Acabei modificando a gem pg_search para suportar expressões arbitrárias de ts_vector em vez de apenas nomes de coluna. As alterações são aqui

Agora eu posso escrever:

pg_search_scope :search, 
    against: [[:title , 'B'], ["to_tsvector(regexp_replace(url, '[^\w]+', ' ', 'gi'))", 'A']],
    using: {tsearch: {dictionary: "simple"}}
    
por mihai 06.01.2013 / 11:44
fonte
5

Como indicado na documentação (e observado por AJcodez), há uma solução na criação de uma coluna dedicada para o índice tsvector. Em seguida, defina um acionador que capture inserções para indexar URLs corretamente:

CREATE test_url (url varchar NOT NULL, url_tsvector tsvector NOT NULL);

Este método transmite qualquer caractere não alfa em um único espaço e transforma a string em um tsvector:

CREATE OR REPLACE FUNCTION generate_url_tsvector(varchar) 
RETURNS tsvector 
LANGUAGE sql 
AS $_$
    SELECT to_tsvector(regexp_replace($1, '[^\w]+', ' ', 'gi'));
$_$;

Agora crie um acionador que chame essa função:

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();

Agora, quando o url for inserido, o campo "url_tsvectorè" será preenchido 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)

Para pesquisar em FT em URLs, você só precisa consultar esse campo.

SELECT * FROM test_url WHERE url_tsvector @@ 'google'::tsquery;
    
por greg 02.01.2013 / 11:53
fonte