mih*_*hai 10 postgresql ruby-on-rails pg-search
我正在使用pg_search在我的模型中进行一些文本搜索.在其他属性中,我有一个url字段.
Unfortuantelly Postgres似乎没有识别/和.作为单词分隔符,因此我无法搜索url.
示例:test在http://test.com中搜索不会产生任何结果.
有没有办法解决这个问题,可能使用另一个gem或一些内联SQL?
正如文档中所述(并由AJcodez注意到),有一个为tsvector索引创建专用列的解决方案.然后定义一个触发器,用于正确捕获索引URL的插入:
CREATE test_url (url varchar NOT NULL, url_tsvector tsvector NOT NULL);
Run Code Online (Sandbox Code Playgroud)
此方法将任何非alpha字符转换为单个空格,并将字符串转换为tsvector:
CREATE OR REPLACE FUNCTION generate_url_tsvector(varchar)
RETURNS tsvector
LANGUAGE sql
AS $_$
SELECT to_tsvector(regexp_replace($1, '[^\w]+', ' ', 'gi'));
$_$;
Run Code Online (Sandbox Code Playgroud)
现在创建一个调用此函数的触发器:
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();
Run Code Online (Sandbox Code Playgroud)
现在,当插入url时,将自动填充`url_tsvectorè字段.
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)
Run Code Online (Sandbox Code Playgroud)
要在FT上搜索URL,您只需要查询此字段.
SELECT * FROM test_url WHERE url_tsvector @@ 'google'::tsquery;
Run Code Online (Sandbox Code Playgroud)
我最终修改了pg_search gem 以支持任意 ts_vector 表达式,而不仅仅是列名。变化就在这里
现在我可以写:
pg_search_scope :search,
against: [[:title , 'B'], ["to_tsvector(regexp_replace(url, '[^\\w]+', ' ', 'gi'))", 'A']],
using: {tsearch: {dictionary: "simple"}}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
1485 次 |
| 最近记录: |