4

我正在使用 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 没有命中

4

1 回答 1

7

我是 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', '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)
于 2012-10-13T18:30:07.207 回答