我正在使用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
则没有答案 0 :(得分:5)
我是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中构建一个text search dictionary,以便将电子邮件地址正确地拆分为令牌。
以下是文本搜索解析器知道它是电子邮件地址的证据:
grant=# SELECT ts_debug('english', 'name@example.com');
ts_debug
-----------------------------------------------------------------------------
(email,"Email address",name@example.com,{simple},simple,{name@example.com})
(1 row)