2012-09-29 51 views
3

我正在使用Pg全文搜索进行搜索。因为我在rails上使用Ruby,所以我使用pg_search gem。我如何配置它以给子串打一个命中。在rails上使用pg_search gem进行PG全文搜索

pg_search_scope :search_by_detail, 
       :against => [ 
        [:first_name,'A'], 
        [:last_name,'B'], 
        [:email,'C'] 
       ],     
       :using => { 
       :tsearch => {:prefix => true} 
       } 

现在它给一击,如果子是在开始,但它不会给一击,如果在中间

例如串它给出了[email protected]但不能一击example.com

回答

4

我是pg_search的作者和维护者。

不幸的是,PostgreSQL的默认tsearch不分割电子邮件地址,并允许您匹配部分。不过,如果您打开:trigram搜索,它可能会起作用,因为它匹配可搜索文本中任何位置出现的任意子字符串。

pg_search_scope :search_by_detail, 
       :against => [ 
        [:first_name,'A'], 
        [:last_name,'B'], 
        [:email,'C'] 
       ], 
       :using => { 
        :tsearch => {:prefix => true}, 
        :trigram => {} 
       } 

我证实了这一点通过PSQL中运行以下命令:

grant=# SELECT plainto_tsquery('example.com') @@ to_tsvector('english', '[email protected]'); 
?column? 
---------- 
f 
(1 row) 

我知道解析器做检测的电子邮件地址,所以我想它一定是可能的。但是它会涉及到在PostgreSQL中建立一个text search dictionary,它可以正确地将电子邮件地址分割成标记。

这里是证据表明,文本搜索解析器知道,这是一个电子邮件地址:

grant=# SELECT ts_debug('english', '[email protected]'); 
            ts_debug         
----------------------------------------------------------------------------- 
(email,"Email address",[email protected],{simple},simple,{[email protected]}) 
(1 row) 
+0

但如果我需要找到文本'title'在字符串'一些长期字幕string'? – Blaze

+0

我认为你应该尝试一些测试场景。当涉及到pg_search时,您受到PostgreSQL能够执行的操作的限制,最好试验一下,看看最适合您的用例。 对于'title'匹配'subtitle',你需要用':trigram'匹配。 – nertzy