使用pg_search gem for substring在轨道上进行PG全文搜索

我正在使用Pg全文搜索进行搜索。 由于我在rails上使用Ruby,我使用的是pg_search gem。 我如何配置它以给出子串的命中。

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

现在,如果子字符串在开头,它会给出一个命中,但如果中间的子字符串则不会给出命中

示例它为sdate@example.com命中,但不是example.com

我是pg_search的作者和维护者。

不幸的是,默认情况下PostgreSQL的tsearch不会拆分电子邮件地址,并允许您匹配部分。 如果你打开它可能会有效:trigram但是, :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', 'name@example.com'); ?column? ---------- f (1 row) 

我知道解析器确实检测到了电子邮件地址,所以我认为它必须是可能的。 但它将涉及在PostgreSQL中构建一个文本搜索字典 ,它可以将电子邮件地址正确地拆分为令牌。

以下是文本搜索解析器知道它是电子邮件地址的证据:

 grant=# SELECT ts_debug('english', 'name@example.com'); ts_debug ----------------------------------------------------------------------------- (email,"Email address",name@example.com,{simple},simple,{name@example.com}) (1 row)