我正在使用pg_search在我的模型中进行一些文本搜索。在其他属性中,我有一个url
字段。
不幸的是,Postgres 似乎没有识别/
和.
作为单词分隔符,因此我无法在url
.
test
示例:在http://test.com中搜索不会产生任何结果。
有没有办法解决这个问题,也许使用另一个 gem 或一些内联 SQL ?
我正在使用pg_search在我的模型中进行一些文本搜索。在其他属性中,我有一个url
字段。
不幸的是,Postgres 似乎没有识别/
和.
作为单词分隔符,因此我无法在url
.
test
示例:在http://test.com中搜索不会产生任何结果。
有没有办法解决这个问题,也许使用另一个 gem 或一些内联 SQL ?
如文档中所述(并由 AJcodez 注意到),有一种解决方案可以为 tsvector 索引创建专用列。然后定义一个触发器来正确捕获对索引 url 的插入:
CREATE test_url (url varchar NOT NULL, url_tsvector tsvector NOT NULL);
此方法会将任何非字母字符转换为单个空格并将字符串转换为 tsvector:
CREATE OR REPLACE FUNCTION generate_url_tsvector(varchar)
RETURNS tsvector
LANGUAGE sql
AS $_$
SELECT to_tsvector(regexp_replace($1, '[^\w]+', ' ', 'gi'));
$_$;
现在创建一个调用此函数的触发器:
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();
现在,当 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)
要在 URL 上进行 FT 搜索,您只需查询此字段。
SELECT * FROM test_url WHERE url_tsvector @@ 'google'::tsquery;
稍微简单的方法,将协议令牌类型添加到simple
字典中:
ALTER TEXT SEARCH CONFIGURATION simple
ADD MAPPING FOR protocol
WITH simple;
english
如果需要词干,也可以将其添加到字典中