2012-09-29 76 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

相關問題